본문 바로가기

[BOJ] - JAVA

[백준] 3052 : 나머지 JAVA 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashSet;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashSet<Integer> h = new HashSet<Integer>();
        
        for(int i=0;i<10;i++){
            h.add(Integer.parseInt(br.readLine())%42);
        }
        br.close();
        System.out.print(h.size());
    }
}

HashSet의 존재를 이번에 알게 됐다.

혼자서 배열을 이용해서 풀려고 했을 때는 입력되는 값이 10개이니, 각각의 값을 42로 나눈 나머지를 배열에 넣고 배열안에서 서로 다른 값의 개수를 세려고 했다.

그런데...그렇게하면 반복문을 많이 써야 하고 비효율적일 것 같아 다른 사람들이 배열을 이용해서 푼 것을 찾아보았는데, 정말 감탄이 나왔다.

10개짜리 정수 배열을 만들기보다...42로 나누었을 때 나올 수 있는 나머지의 개수만큼의 불린형 배열을 만들어서 푸는 것이 훨씬 간편했기 때문이다.

역시 갈 길이 멀다.

무작정 정수형으로 변수를 선언하기보다 좀 더 용도에 맞는 타입이 무엇인지 생각해볼 필요성을 느끼게 됐다.

아래는 배열을 이용해서 푼 코드이다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean[] arr = new boolean[42];
        
        for(int i=0;i<10;i++){
            arr[Integer.parseInt(br.readLine())%42] = true;
        }
        
        int cnt = 0;
        
        for(boolean val : arr){
            if(val==true){
                cnt++;
            }
        }
        
        br.close();
        System.out.print(cnt);
    }
}