21.05.13 기록

1 분 소요

  • 백준 알고리즘 3052 풀이 완료

    • 내가 푼 3052 풀이 (메모리 14.5MB, 시간 136ms로 통과)
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class B3052 {
        public static void main(String[] args) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int cnt = 0;
            int[] remainder = new int[10];
    
            for(int i = 0; i < remainder.length; i++) {
                try {
                    remainder[i] = Integer.parseInt(br.readLine()) % 42;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            for(int i = 0; i < remainder.length; i++) {
               for(int j = i+1; j < remainder.length; j++) {
                   if(remainder[i] == remainder[j]) remainder[j] = -1;
               }
            }
    
            for(int i = 0; i < remainder.length; i++) {
                if(remainder[i] > -1) cnt++;
            }
    
            System.out.println(cnt);
        }
    }
    
    
    • 첫번째 for문: 값을 입력 받은 후 42로 나눈 나머지 값을 배열로 저장한다.
    • 두번째 for문: 배열의 값을 서로 비교하여 중복된 값일 때에는 -1을 저장한다.
    • 세번째 for문: 배열의 값이 -1보다 큰 값(중복이 아닌 값)일 때만 cnt 값을 증가 시킨다.

    → 배열 값을 어떻게 비교해야할지 모르겠어서 for문을 여러 개 사용했는데 정답이 나와서 놀랬다. (런타임 오류날 줄 알았는데..)
    풀이를 찾아보니 더 좋은 방법이 있어서 밑에 정리했다!


    • [풀이1] HashSet 사용하기 (배열 사용 안한 ver.)
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashSet;
    
    public class B3052 {
        public static void main(String[] args) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            HashSet<Integer> hs = new HashSet<Integer>();
    
            for(int i = 0; i < 10; i++) {
                try {
                    hs.add(Integer.parseInt(br.readLine()) % 42);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            System.out.println(hs.size());
        }
    }
    
    • HashSet은 중복된 값을 저장하지 않으며, 순서의 개념이 없다.


    • [풀이2] 크기가 42인 배열 사용하기(feat. boolean)
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class B3052 {
        public static void main(String[] args) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            boolean[] arr = new boolean[42];
    
            for(int i = 0; i < 10; i++) {
                try {
                    arr[Integer.parseInt(br.readLine()) % 42] = true;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            int cnt = 0;
            for (boolean val : arr) {
                if(val) cnt++;
            }
    
            System.out.println(cnt);
        }
    }
        }
    }
    
    • 나머지 값을 인덱스로 사용하여 boolean 배열에서 true를 준다.
    • 이후 true인 값만 카운트하여 카운트 값을 출력한다.

카테고리:

업데이트: