[JAVA] 백준 3052. 나머지

이 글은 읽는데 약 5분이 걸립니다.

※개인 공부 목적의 정리글입니다.
이 글의 내용이 최선의 해답은 아닐 수 있습니다.

문제

403 Forbidden

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

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

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

요약

입력 된 10개의 숫자의 42로 나눴을 때의 나머지를 모두 구한 후, 겹치는 숫자가 몇 종류인지 출력한다.

나의 코드

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

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] nums = new int[10];
        
        for(int i=0; i<10; i++){
            int num = Integer.parseInt(br.readLine());
            nums[i] = num % 42;
        }
        
        int cnt = 0;
        for(int i=0; i<10; i++){
            if(nums[i] == -1) continue;
            
            cnt++;
            int tmp = nums[i];
            for(int j=0; j<10; j++){
                if(nums[j] == tmp){
                    nums[j] = -1;
                }
            }
        }
        
        System.out.println(cnt);
        br.close();
    }

}

나는 먼저 입력받은 10개의 숫자를 저장할 10칸짜리 int 배열을 만들었다(모두 0으로 초기화된다).

그리고 각 입력의 42의 나머지를 배열에 순서대로 저장하였다.

이 후 다시 배열을 순회하면서 만약 이미 체크한 적이 있는 숫자면 -1로 값을 바꿔줘서 배열의 값이 -1이면 넘기고, 아니면 카운트를 1 올리는 식으로 구현했다.

나의 코드 – 개선점

위 방식은 입력받은 후 내용을 검사하기 위해서 배열을 이중 for문으로 돌아서 오래 걸린다.
다른 사람의 방법을 찾아봤는데 다음과 같다

// https://www.acmicpc.net/source/39602619
import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[] array = new int[42];
		
		for(int i = 0; i < 10; i++) {
			int a = Integer.parseInt(br.readLine())%42;
			array[a] ++;
		}
		
		int result = 0;
		for(int i = 0; i <42; i++) {
			if(array[i] !=0) {
				result++;
			}
		}
		System.out.println(result);
		
	}

}

길이 42짜리 배열을 만든다. 어차피 무조건 42로 나눈 나머지라서 나머지의 종류는 0~41까지 총 42개의 숫자 중 하나이다.

이후 각 입력에 대해서 나머지 값 자체를 인덱스로 하여서 해당 위치는 ++을 하여서 그 위치의 값을 0이 아니게 바꾸어 준다.

이후 배열을 한번 순회하면서 값이 0이 아닌 곳이 있을 때 마다 카운트를 1씩 올린다.
값이 0이 아니라는 것은 한번이라도 나머지 값으로 나온적이 있는 지점이기 때문이다.

이런 단순한 문제도 더 쉽거나 좋게 풀 수 있는 방법이 있다는 것을 느꼈다.

댓글