ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 3052번 : 나머지
    알고리즘, SQL/알고리즘 2023. 11. 28. 16:08

    문제

    두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.

    예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 

    수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.

    그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

     

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

     

    3052번: 나머지

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

    www.acmicpc.net

    문제보고 별 생각 없이 이중for문 사용하면 될 것 같아서 사용했는데, 잘 안돼서 이것저것하다가 2시간 정도 해맸다...

    이게 풀 수 있을 거 같은데 안돼서 이악물고 혼자 풀었다.

    내 코드

    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            int[] arr = new int[10];
            int[] res = new int [10];
            for(int i=0; i<10; i++) {
                arr[i] = scan.nextInt();
            }
    
            for(int i=0; i<arr.length; i++) {
                arr[i] = arr[i] % 42; //42로 나눈 것의 나머지로 arr 재정의
            }
            
            for(int i=0; i<arr.length; i++) { //1:1비교를 통해서 같은 값이 있는지 확인
                int count = 0;
                for(int j=i; j<arr.length; j++ ) { //이전에 비교했던 값 중복비교 방지를 위해 j를 i값에 맞춤   
                    if(arr[i] == arr[j]) {
                        ++count;
                        res[i] = count; //배열에 저장하지 않고 직접 비교했어도 됐음(불필요 코드)
                    }
                }
            }
    
            int count1 = 0;
            for(int i: res) { //(불필요 코드)
                if(i==1) {
                    count1++;
                }
            }
            System.out.println(count1);
        }
    }

    중첩 반복문을 사용해서 1:1 비교를 통해서 풀었다.

    1:1로 비교할 때, 내부의 for문에서 값을 중복적으로 비교하는 것을 어떻게 처리해야할지에 대해 시간을 많이 썼다.

     

    사실 이전에 풀었던 백준 1157번(단어 공부) 문제에서 알파벳을 배열로 만들어서 중첩 반복문을 사용안한 것 처럼 만들 수 있을것 같은데,,,라고 생각하다가 뇌용량이 부족해서 실패했었다.

    그런데 검색해보니까 그렇게 푸신 분이 있었다.

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.IOException;
     
    public class Main {
        public static void main(String[] args) throws IOException {
    
            boolean[] arr = new boolean[42];
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            for(int i = 0 ; i < 10 ; i++) {
                arr[Integer.parseInt(br.readLine()) % 42] = true;
            }
    
            int count = 0;
            for(boolean value : arr) {
                if(value){    // value 가 true 라면
                    count++;
                }
            }
            System.out.println(count);
        }
    }

    나머지가 나올 수 있는 수(0~41)를 배열로 만들어서 중첩반복문을 사용하지 않고 문제를 풀었다.

     

    그런데 다 풀고 검색해보니까 HashSet을 사용해서 간단하게 풀 수 있는 문제였다..

    다른풀이

    import java.util.Scanner;
    import java.util.HashSet;
     
    public class Main {
     
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            HashSet<Integer> h = new HashSet<Integer>();
    
            for (int i = 0; i < 10; i++) {
                h.add(in.nextInt() % 42);
            //입력받은 값의 나머지 값을 add메소드를 통해 HashSet에 저장
            }
    
            in.close();
            System.out.print(h.size());
        }
    }

    에...? 이렇게 쉽게 푸는거라고,,?

    중복원소를 허용하지 않는 HashSet을 사용하면 되는 것이었는데 몰라봤다.

    문제에서 "서로 다른 값이 몇 개인가?" 라는 말이 "중복을 없앤 값이 몇 개인가?" 라는 뜻으로 HashSet을 사용하라는 뜻이었다.

    HashSet에 대해 정리해야겠다..

    아직 많이 부족함을 다시 느낀다ㅠ


    참고자료

    https://st-lab.tistory.com/46

    '알고리즘, SQL > 알고리즘' 카테고리의 다른 글

    백준 7568번 : 덩치  (1) 2023.12.12
    queue란 무엇인가?  (0) 2023.12.10
    백준 2164번 : 카드2  (0) 2023.12.06
    HashSet이란?  (0) 2023.12.02
    백준 1157번 : 단어 공부  (2) 2023.11.27
Designed by Tistory.