백준 10807
개수 세기
주의할 점
둘째 줄은 공백으로 구분되어있다고 했으니 StringTokenizer을 사용한다.
[BufferedReader 사용한 정답]
StringTokenizer st = new StringTokenizer(br.readLine()); 이렇게 해도 자동으로 공백을 기준으로 파싱해줌
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 입력값
int[] array = new int[n]; //입력값의 배열
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int searchNum = Integer.parseInt(br.readLine()); // 찾는 수
int count = 0; // 찾은 개수
for(int i=0; i<array.length; i++) {
array[i] = Integer.parseInt(st.nextToken());
if(array[i] == searchNum) {
count++;
}
}
System.out.println(count);
}
}
의아한 점은 searchNum 을 StringTokenizer 위에 있으면 런타임 에러가 난다..?
처음에 짰던 코드.
int n = Integer.parseInt(br.readLine()); // 입력값
int[] array = new int[n]; //입력값의 배열
int searchNum = Integer.parseInt(br.readLine()); // 찾는 수
int count = 0; // 찾은 개수
StringTokenizer st = new StringTokenizer(br.readLine()," ");
게시글에 물어봐도 답변이 없어 아직도 의문이다..
백준 10871
X보다 작은 수
배열을 쓸 수도 있고 안쓸수도 있는 방법이 있다
[먼저 Scanner 을 사용하여 배열을 썼을 때]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int X = sc.nextInt();
int arr[] = new int[N];
for(int i=0; i<N; i++) {
arr[i] = sc.nextInt();
}
sc.close();
for(int i=0; i<N; i++) {
if(arr[i] < X) {
System.out.print(arr[i] + " ");
}
}
}
}
for문안에 한꺼번에 적어도 된다 (성능은 조금 떨어지지만..)
for(int i=0; i<N; i++) {
arr[i] = sc.nextInt();
if(arr[i] < X) {
System.out.print(arr[i] + " ");
}
}
주의할 점!! print 로 출력해야함!
print() vs println()
System.out.print("Hello World");
System.out.print("Hello World");
- print() : 줄바꿈 없이 한 줄로 출력
Hello WorldHello World
- println() : 줄바꿈 된채로 출력
Hello World
Hello World
[배열을 쓰지않고 BufferedReader + StringTokenizer 사용]
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int n = Integer.parseInt(st.nextToken()); // 수열
int x = Integer.parseInt(st.nextToken()); // 정수
st = new StringTokenizer(br.readLine()," ");
for(int i=0; i<n; i++) {
int a = Integer.parseInt(st.nextToken());
if(a < x) {
System.out.print(a+" ");
}
}
}
}
st = new StringTokenizer(br.readLine()," "); 를 중간에 한번더 쓰는 이유
StringTokenizer은 br.readLine() 한 줄을 문자열로 읽고 " " 공백을 기준으로 분리해준다
첫번째 줄 입력을 StringTokenizer st = new StringTokenizer(br.readLine()," "); 로 읽고 st.nextToken() 으로 반환하여 n , x 에 담았다
다음 두번째 줄은 n개의 문자열이 한줄로 입력받는다.
st = new StringTokenizer(br.readLine()," "); 을 통해 한 줄을 읽고 for문에서 st.nextToken() 으로 반환하여
x보다 작은지 if문을 통해 print 해준다.
StringTokenizer을 중간에 넣지 않으면 런타임 에러가 뜸
+ [StringBuilder 도 사용했을 때]
가장 성능이 좋음
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int n = Integer.parseInt(st.nextToken()); // 수열
int x = Integer.parseInt(st.nextToken()); // 정수
st = new StringTokenizer(br.readLine()," ");
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++) {
int a = Integer.parseInt(st.nextToken());
if(a < x) {
sb.append(a).append(' ');
}
}
System.out.println(sb);
}
}
System.out.println(sb); 는 for문이 끝나고 넣기
백준 10818
최소, 최대
배열을 사용해보자
최댓값 최소값을 찾는 방법은 Arrays.sort() 메소드 사용해보자
첫번째 정답
[ BufferedReader 사용 + for문 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 첫줄 입력값
int arr[] = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
for(int i=0; i<n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
System.out.println(arr[0] + " " + arr[n-1]);
}
}
Arrays.sort() 는 오름차순으로 정렬 해주는 메서드이다.
오름차순으로 정렬했으니 인덱스 첫번째 값이 최소값 , 인덱스 마지막 값이 최댓값.
그러므로
최소값은 index 0 = arr[0]
최대값은 index 0 부터 시작하니까 마지막 배열은 -1 = arr[n-1]
두번째 정답
[ BufferedReader 사용 + while문 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 첫줄 입력값
int index = 0;
int arr[] = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
while(st.hasMoreTokens()) { //hasMoreTokens() : st 토큰이 남아있으면 true, 없으면 false
arr[index] = Integer.parseInt(st.nextToken());
index++;
}
Arrays.sort(arr);
System.out.println(arr[0] + " " + arr[n-1]);
}
}
for문의 변수 i 대신 while문은 index = 0 변수값을 넣어준다
hasMoreTokens() 는 StringTokenizer 에 토큰이 남아있으면 true, 비어있으면 false를 반환
세번째 정답
가장 성능 좋으려면 배열 쓰지 않아야한다.
[ 배열을 쓰지 않고 BufferedReader 사용하기 ]
모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Integer.parseInt(br.readLine()); // 첫줄 입력값
StringTokenizer st = new StringTokenizer(br.readLine()," "); // 공백기준 분리
int max = -1000001;
int min = 1000001;
while(st.hasMoreTokens()) { //hasMoreTokens() : st 토큰이 있으면 true(반복), 없으면 false
int result = Integer.parseInt(st.nextToken()); // result = 분리 된 문자열
if(result>max) { //result<max(1000001) = 최소값
max = result;
}
if(result<min) { //result>min(-1000001) = 최대값
min = result;
}
}
System.out.println(min + " " + max);
}
}
처음에는 당연히 이렇게 초기화를 해줬더니 반대결과가 나왔다
int max = 1000001;
int min = -1000001;
▼
result < max(1000001) = 최소값
result > min(-1000001) = 최대값
max 를 가장 작은 값으로 초기화하고 min 을 가장 큰 값으로 초기화 해주자
int max = -1000001;
int min = 1000001;
▼
result > max(-1000001) = 최대값
result < min(1000001) = 최소값
st.hasMoreTokens() 으로 다음 토큰이 있을때까지 true (반복) , 없으면 false
백준 2562
최댓값
첫번째
[ 배열을 쓰고 BufferedReader 사용 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] arr = new int[9];
int max = 0;
int index = 0;
for(int i=0; i<3; i++) {
arr[i] = Integer.parseInt(br.readLine());
if(arr[i] > max) {
max = arr[i];
index = i+1;
}
}
System.out.println(max);
System.out.println(index);
}
}
두번째
[ 배열을 쓰지 않고 BufferedReader 사용 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int max = 0;
int index = 0;
for(int i=0; i<9; i++) {
int result = Integer.parseInt(br.readLine());
if(result > max) {
max = result;
index = i+1;
}
}
System.out.println(max);
System.out.println(index);
}
}
최댓값이 몇 번째 수인지 구하는거라서
index++ 하면 8번째 최댓값이 7번째가 돼서 오답!
백준 5597
과제 안 내신 분..?
처음에 헷갈렸던 문제
먼저 총 학생수 30명 배열을 만든다 ▶ int[] student = new int[30];
그 다음 입력값인 28명 출석한 학생수를 for문 반복문으로 만든다 ▶ for(int i=0; i<28; i++) {}
출석한 학생 인덱스에 1을 저장하여 출석하지 않은 학생은 0값. 즉 1과 0 으로 구분하자
▶ student[Integer.parseInt(br.readLine()) -1] = 1;
인덱스는 0부터 시작하니까 -1 을 해줌.
입력값이 2 5 4 1 일때 첫번째 2 입력값이 [2-1] 계산해서 student[1] 배열에 1이 저장.
즉 입력값 2 5 4 1 = [1] [4] [3] [0] 배열에 1 값 저장
다음 전원 30명에서 출석하지 않은 학생은 0 값이고 출력값은 배열은 0부터 시작하니까 + 1 해준 학생번호를 출력해준다.
▶ if(student[i] == 0) {
System.out.println(i+1);
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] student = new int[30]; //30명 배열
//28명 제출한 사람 반복문
for(int i=0; i<28; i++) {
student[Integer.parseInt(br.readLine()) -1] = 1; // 출석한 학생 index에 1을 기록
}
//30명 중 미제출 i번호는 0값
for(int i=0; i<30; i++) {
if(student[i] == 0) {
System.out.println(i+1); // 배열은 0부터라 +1해준다. 츌석은 1부터 시작하니까
}
}
}
}
백준 3052
나머지
서로 다른 나머지 값의 개수를 구하라.
배열없이 hashset 쓰면 간단하다.
- HashSet
1. 중복 X
2. 순서 X (어짜피 서로 다른 값의 개수만 구하면 되니까)
[ BufferedReader + hashset ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// HashSet : 중복x 순서개념x 오로지 '서로 다른 나머지 개수'만 세면 됨.
HashSet<Integer> hs = new HashSet<Integer>();
for(int i=0; i<10; i++) {
hs.add(Integer.parseInt(br.readLine()) % 42); //.add() : HashSet에 저장하는 메서드
}
// HashSet에 저장된 원소의 개수 .size
System.out.println(hs.size());
}
}
Hash.add() : HashSet에 저장하는 메서드
Hash.size() : HashSet에 저장돼 있는 개수(크기)를 반환하는 메서드
백준 1546
평균
- 주의할 점!
평균은 소수점이 나와야하니까 double
최고점을 구분하기 위해서 Array.sort() 메서드를 써서 오름차순으로 정렬한다 (마지막이 가장 큰 수)
최고점을 통해 (각 점수/최고점)%100 계산 후 새로운 평균을 구한다.
[BufferedReader]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double arr[] = new double[Integer.parseInt(br.readLine())];
//점수입력 공백 구분
StringTokenizer st = new StringTokenizer(br.readLine()," ");
for(int i=0; i<arr.length; i++) {
arr[i] = Double.parseDouble(st.nextToken());
}
Arrays.sort(arr); //오름차순으로 정렬(마지막 큰 수)
double sum = 0;
for(int i=0; i<arr.length; i++) {
sum += (arr[i] / arr[arr.length -1]) * 100; //인덱스는 0부터 시작하니 마지막이 큰 수는 -1
}
//새로운 평균
System.out.println(sum/arr.length);
}
}
- 첫 과목 수를 입력하고
double arr[] = new double[Integer.parseInt(br.readLine())];
- double형이니까 Double.parseDouble 으로 쓴다
for(int i=0; i<arr.length; i++) {
arr[i] = Double.parseDouble(st.nextToken());
}
- 연산 할때 double로 형변환을 해야한다! double sum
'공부' 카테고리의 다른 글
메소드화 | 객체화 | 인스턴스 (0) | 2023.06.16 |
---|---|
메소드 (1) | 2023.06.16 |
[백준] 3단계 | 반복문 8~12 (0) | 2023.02.17 |
[백준] 3단계 | 반복문 1~7 (0) | 2023.02.14 |
[백준] 2단계 | 조건문 1~7 (2) | 2023.01.28 |