알고리즘 및 자료구조/백준(BackJoon)

백준 - 3052번

지팡구 2022. 8. 8. 01:11

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

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

 

문제 설명 : 

자연수 10개가 주어지면, 각 자연수를 42로 나눈 나머지를 구한 뒤, 나머지 값들 중 서로 다른 값이 몇 개 있는지 출력하는 문제

 

내 생각 :

입력된 값에 42로 나눈 나머지를 구한 뒤, 배열에 저장해서 요소를 확인하는 방법으로 문제를 접근했다.

문제를 접근하는 과정에서 어떻게 배열의 요소의 중복을 count 할 것인지에 대해 생각했고, 이 부분에서 좀 시간을 잡아먹었다.

 

내가 작성한 코드는 다음과 같다.

                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                int [] arr=new int[10];
                boolean bl;
                int count=0;
                for(int i=0; i<10; i++){
                    arr[i]=Integer.parseInt(br.readLine())%42;
                }
                    for(int j=0; j<arr.length; j++){
                        bl=false;
                        for(int k=j+1; k<arr.length; k++){
                            if(arr[j]==arr[k]){
                                bl=true;
                                break;
                            }
                        }
                        if(bl==false){
                            count++;
                        }
                    }
        System.out.println(count);

이 코드에서 가장 핵심적인 부분은 2번째 반복문이다. 

첫 번째 반복문은 입력받은 수에 42를 나눈 나머지를 저장하게 되고,  다음 반복문부터 본격적으로 우리가 원하는 결과를 얻기위한 과정인데, 이중 반복문을 수행하면서, 만약 배열의 요소값이 같다면 불린 변수의 값은 참으로 바뀌고, 해당 반복문을 종료하게 된다.

 

그러나 반복문을 다 돌아도 같은 요소가 없다면 count는 증가하게 된다. 

이러한 방식을 통해 중복값을 제외하고 결과 값을 구하게 되었다.

 

 

내가 생각한 방법 외에도 배열을 사용하지 않고 HashSet을 이용하는 방법이 있다.

(이게 무엇인지는 알지만 한 번도 사용해본적이 없어 낮설다.)

 

우선 HashSet은 컬렉션 프레임웍의 일부로 set 인터페이스를 구현한 대표적인 컬렉션이다. set 인터페이스의 특징대로 중복된 요소를 저장하지 않으며 저장 순서가 유지되지 않는 컬렉션 클래스이다. 

 

이 HashSet에 요소를 추가하기 위해 add메소드나 addAll 메소드를 사용하는데, 만약 이미 저장된 요소를 또 저장하고자 한다면 이 메소드들은 false를 반환하고 추가하지 않는다. 

 

이를 이용해 문제를 해결할 수 있는데, 연산을 실행한 값을 HashSet을 통해 저장하고 중복값은 저장하지 않으니 최종적으로 이 HashSet의 size만 출력하면 되는 것이다.

 

그리고 앞서 설명한 것 처럼 HashSet은 저장 순서를 유지하지 않기에, 만약 이 순서를 유지하고 싶으면 LinkedHashSet을 이용해야 한다.

 

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashSet<Integer> set = new HashSet<Integer>();

        for(int a=0; a<10; a++){
            set.add(Integer.parseInt(br.readLine())%42);
        }
        System.out.println(set.size());

이렇게 짧게 코드를 구현할 수 있다.

 

 

성능을 확인해보면 비슷하다...  HashSet을 이용하는 것이 메모리를 더 적게 사용하고 가독성이 좋다

'알고리즘 및 자료구조 > 백준(BackJoon)' 카테고리의 다른 글

백준 - 8958 번  (0) 2022.08.09
백준 - 1546번  (0) 2022.08.07
백준 - 2577번  (0) 2022.08.05
백준 -2562번  (0) 2022.08.05
백준 - 10818번  (0) 2022.08.05