백준 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 

 

 

 

 

반응형
LIST

'공부' 카테고리의 다른 글

메소드화 | 객체화 | 인스턴스  (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

+ Recent posts