코딩테스트

[백준/JAVA] 3052 나머지 (배열, Hashset 사용)

코드사냥꾼 2021. 4. 29. 15:35

문제

 

풀이

함수를 사용해서 푸는 방법을 몰라서 배열을 사용했지만, Hashset을 사용하면 아주 쉽고 간단하게  풀리는 문제였다.

 

- 배열 사용 

나머지 값들을 순차적으로 정리해서 뽑아내면 편할 것 같아 Arrays.sort를 사용했지만, 해당 메소드를 빼고 구현하면 오류가 나버렸다. 왜인지는 아직까지 모르겠다. 그리고 count를 1로 지정한 이유는 나머지가 없을 때(=0) 일때 1이 출력되는 예가 있었기 때문이다.

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int[] arr = new int[10];
        
        // 서로 다른 나머지 개수 카운트
        int count = 1;
       
        // 값 입력받기
        for(int i=0; i<arr.length; i++) {
            // 값 입력받자마자 42로 나눈 것을 저장한다.
            arr[i] = Integer.parseInt(br.readLine())%42;
        } 
        
        Arrays.sort(arr);
        
        // 다른 값 확인
        for(int i=0; i<arr.length-1; i++) {
           if(arr[i]!=arr[i+1]) {
               count++;
           }
        }
        System.out.print(count);
    }
}

 

- HashSet 사용

HashSet은 자바 Collection 중의 Set의 파생클래스라고 한다. 이때, Set을 하나의 집합이라고 생각하면 되며 HashSet의 특징은 다음과 같다.

1. 중복되는 값은 하나만 저장한다. (즉, 중복 허용X)

2. HashSet은 순서 개념이 없다. 따라서 Collections.sort() 메소드를 사용할 수 없다. 정렬하고 싶다면 리스트로 변환 후 정렬해야한다.

따라서, HashSet에 저장된 값의 개수는 서로 다른 값의 개수 즉, HashSet의 사이즈가 된다.

// 기본 사용법 1
HashSet<Integer> hs = new HashSet<Integer>();

// 기본 사용법 2 : new에서 타입 파라미터 생략 가능
HashSet<Integer> hs = new HashSet<>();

// 기본 사용법 3 : 선언 후 값 추가
HashSet<Integer> set = new HashSet<Integer>();
set.add(1); 
set.add(2);
set.add(3);

// 기본 사용법 4 : 특정 값 삭제
set.remove(특정 값);

// 기본 사용법 5 : 모든 값 삭제
set.clear();
import java.io.*;
import java.util.*;

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

훨씬 코드가 간결해진 것을 볼 수 있다.

 

 

www.acmicpc.net/problem/3052

 

3052번: 나머지

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

www.acmicpc.net

 

'코딩테스트' 카테고리의 다른 글

[백준/JAVA] 8598 OX퀴즈  (0) 2021.04.29
[백준/JAVA] 1546 평균 (StringTokenizer 주의점)  (0) 2021.04.29
[백준/JAVA] 2562 최댓값  (0) 2021.04.28
[백준/JAVA] 10818 최소, 최대  (0) 2021.04.28