Programming/Algorithm

[백준] 3052번 : 나머지 (Java)

Supreme_YS 2021. 10. 27. 13:11
 

3052번: 나머지

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

www.acmicpc.net

문제

- 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.


여러가지 풀이가 있을 수 있지만, 입력은 크게 두 가지 방법으로 나눠서 풀이를 진행해보았다. 

먼저, Scanner를 이용한 방법이다.

package Step5;
import java.util.Arrays;
import java.util.Scanner;

public class Remainder {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in); // Scanner 객체를 생성한다.
        int[] remainder = new int[10]; // 입력받은 값의 나머지를 담을 배열을 생성한다.
        int cnt = 0; // 서로 다른 나머지 숫자의 갯수 측정
        boolean bl; // n번째와 n+1의 숫자 비교를 위한 boolean

        for (int i=0; i<remainder.length; i++) {
            remainder[i] = input.nextInt() % 42;
        } // 배열의 길이만큼 반복문을 돌면서 10개의 값을 입력받음과 동시에 42를 나눈 나머지 값을 배열의 인덱스에 할당해준다.

        for (int j=0; j<remainder.length; j++) {
            bl = false; // 초기값을 false로 세팅해준다. 

            for(int k=j+1; k<remainder.length; k++) { // 첫번째 루프에서 0번째와 1번째의 값을 비교해서 
                if ( remainder[j] == remainder[k]){ // 그 값이 같다면
                    bl = true; // true로 boolean형을 바꾸고 for문을 빠져나온다.
                    break;
                }
            }
            if( bl == false ) { // 하지만 값이 다르다면 
                cnt ++; // cnt를 1 증가시킨다.
            }
        }
        System.out.println(cnt);
        System.out.println(Arrays.toString(remainder));
    }
}

다음은 Scanner보다 연산 속도가 빠른 BufferedReader를 이용한 방법이다.

package Step5;

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

public class ImproveRemainder {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int[] remainder = new int[10];
        boolean bl;
        int cnt = 0;

        for(int i=0; i<remainder.length; i++){
            remainder[i] = Integer.parseInt(br.readLine()) % 42; // BufferedReader는 String형이기 때문에 Integer Parsing이 필요하다.
        }

        for(int j=0; j<10; j++){
            bl = false;
            for (int k=j+1; k<remainder.length; k++) {
                if( remainder[j] == remainder[k] ){
                    bl = true;
                    break;
                }
            }
            if ( bl == false ){
                cnt ++;
            }
        }
        System.out.println(cnt);
    }
}

여러 코드들을 검색하다보니 HashSet을 이용한 방법도 있었다.

package Step5;

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

public class HashSetRemainder {
    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);
            //입력받은 값의 나머지 값을 add메소드를 통해 HashSet에 저장
        }
        br.close();
        System.out.print(hs.size()); //HashSet의 값 출력
    }
}

HashSet은 Collection중 Set의 파생클래스로, 몇가지 특징이 있다.

  • 중복되는 원소를 넣을 경우 하나만 저장한다.(중복원소를 허용하지 않는다.)
  • HashSet은 순서 개념이 없어서 정렬하는 기능인 Collection.sort()메소드를 사용할 수 없다.
    (정렬하고 싶다면 리스트로 변환 후 정렬해야 한다.)

'Programming > Algorithm' 카테고리의 다른 글

[백준] 팩토리얼  (0) 2021.10.28
[백준] 2434번 : 별 찍기 - 1  (0) 2021.10.27
[백준] 빠른 A+B (JAVA)  (0) 2021.10.20
선형 리스트 (Linear List)  (0) 2021.09.27
알고리즘의 개념  (0) 2021.09.27