상냥한 세상 :: [백준]10871번: X보다 작은 수

본문으로 바로가기

[백준]10871번: X보다 작은 수

category Computer Science/BAEKJOON JAVA Practice 2022. 1. 13. 15:00

https://www.acmicpc.net/problem/2439

 

2439번: 별 찍기 - 2

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net

  • 문제

X보다 작은수를 출력해야하므로 if문을 써야할 것이다.

for문은 출력순서를 결정짓는 역할을 해준다. 

 

또한, N과 X를 입력하는것으로도 모자라서

수열을 담을 공간을 할당해주어야하기 때문에 for문안에서의 배열을 사용해 index=0~index=N-1 에 수열 A를 이루는 숫자들을 담아주도록한다. 

 

그다음, for문으로 수열을 차례차례 읽어들인다음 만일 특정수열에 담긴 숫자가 정수 X미만일 경우 해당 숫자를 출력해주는 출력문을 짜주면 된다. 


  • 코드 1
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        
        int N=in.nextInt();
        int X=in.nextInt();
        
        int arr[]=new int[N];
        for(int i=0; i<N; i++){
            arr[i]=in.nextInt();
        }
        
        in.close();
        
        for(int i=0; i<N; i++){
            if(arr[i]<X){
                System.out.print(arr[i]+" ");
            }
        }
    }
}

  • 결과


  • 코드 2
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        
        int N=in.nextInt();
        int X=in.nextInt();
        
        StringBuilder sb=new StringBuilder();
        
        for(int i=0; i<N; i++){
        
            int value=in.nextInt();
            if(value<X){ 
                sb.append(value+" ");
            }
        }
        System.out.println(sb);
    }
}

배열을 사용하지 않는 방법이다. 배열을 사용하면 그냥 수열로 이루어진 정수들이 배열에 담기고, 배열에서 for문으로 각 숫자가 조건문에 부합하는지 읽어들인 다음, 부합시 바로 출력해주는 형태였다.

StringBuilder을 사용하면, 수열로 입력할 정수들이 입력과 동시에 바로아래 if(value<X)에 부합하는지 검사하게 되고, 부합시 sb.append로 sb변수에 저장하게 된다.

 

이후 for문이 완료되고, System.out.println(sb); 를 통해 조건문을 통과한 정수들만 출력해주게 된다. 

 


  • 결과


  • 코드 3
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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());
        
        StringBuilder sb=new StringBuilder();
        st = new StringTokenizer(br.readLine(), " ");
        
        br.close();
        
        
        for(int i=0; i<N; i++){
            
            int A=Integer.parseInt(st.nextToken());
            if(A<X){
                sb.append(A).append(' ');
            }
        }
        System.out.println(sb);
    }
}

여기서 StringTokenizer을 두번사용해주는데엔 이유가 따로 있다. 

우선, 알다시피 StringTokenizer은 문자열 분리자이다. 

StringTokenizer st=new StringTokenizer(br.readLine()," ");

에서 br.readLine()으로 한 줄을 문자열로 읽고, " " 공백을 기준으로 분리해준다. 이후 분리된 토큰을 반환(st.nextToken())하여 각각 N과 X에 담게 된다. 

 

문제를 잘보면 그 바로 아랫줄에 N개의 문자열이 한줄 더 추가된다.

이또한 1 10 2 9 3 8 4 7 6 5 이런식으로 숫자사이에 공백이 있으므로

st = new StringTokenizer(br.readLine()," ");

을 통해 공백을 기준으로 입력한 문자열 분리한 뒤 for문을 통해 st.nextToken()으로 분리된 문자열 토큰을 하나씩 반환하면서 X보다 작은지 아닌지 조건문을 거치게 된다. 

 

참고로, 입력을 공백없이 쳐도 자동으로 공백을 넣어준다는게 아니라 애초에 칠때부터 스페이스바로 공백을 입력해줘야한다. 

 

StringTokenizer는 문자열을 분리해주어 토큰을 갖고있는 객체이다.

예제 입력에서 10, 5를 입력받을 때, new StringTokenizer(br.readLine(), " "); 하면, StringTokenizer 안에는 10과 5가 분리되어 갖고있게 되는 형식이다.

만약 이전 포스팅처럼 for문 안에 StringTokenizer을 넣어주게된다면.. 
for 문때문에 new StringTokenizer()가 계속 생성되고, 빈객체가 계속 생성이 되게 된다.

for(int i=0; i<N; i++){
    st=new StringTokenizer(br.readLine(), " ");
    int A=Integer.parseInt(st.nextToken());
    if(A<X){
        sb.append(A).append(' ');
    }
}

 

i가 i<N을 성립할때까지 계속 입력을 요구하게 된다.

아래의 input창 처럼 

N=3, X=2를 입력했고 다음행에 1 2 3을 입력했음에도 불구하고 br.readLine()으로 '줄' 그자체를 읽어버리기 때문에

i=0을 첫번째 1 2 3으로 인식하고 i=1로 새로운 문자열 '줄'을 요구하게 된다. 

 

그래서 결국엔 한줄 그자체를 읽어버리는 br.readLine()을 담고 있는 StringTokenizer을 for문 밖으로 빼주어야 한줄을 읽고 그 줄안에서의 요소들이 조건문과 부합하는지 점검할 수 있게 된다. 


  • 결과


  • 코드 1, 2, 3 성능 비교

Scanner+배열 사용
Scanner+배열 미사용(StringBuilder 사용)
BufferedReader+StringTokenizer+StringBuilder 사용

 

'Computer Science > BAEKJOON JAVA Practice' 카테고리의 다른 글

[백준]10951번: A+B-4  (0) 2022.01.14
[백준]10952번: A+B-5  (0) 2022.01.13
[백준]2439번: 별 찍기 -2  (0) 2022.01.13
[백준]2438번: 별 찍기 -1  (0) 2022.01.12
[백준]11022번: A+B-8  (0) 2022.01.11