본문 바로가기

알고리즘/백준

[3052]나머지

수행일자 : 2021.07.27


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

 

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로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

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

출력

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

입출력 예제


총 세 가지의 방법으로 풀어볼 것이다.

  • 이중 for 문과 배열 사용
  • boolean과 배열 사용
  • HashSet 클래스 사용

 

이중 for 문과 배열

가장 단순하고, 쉽게 접근할 수 있는 방법이다.

 

선언할 변수 목록은 다음과 같다.

  • 10개의 숫자를 입력받아 42로 나눈 나머지에 대한 값을 담을 배열 [ arr ]
  • 서로 다른 나머지의 개수를 담을 변수 [ count ]
  • 동일한 나머지의 개수를 담을 변수 [ cnt ]

먼저, for 문을 사용하여 배열 arr[] 에 BufferedReader 클래스를 이용하여 10개의 숫자를 입력받는다. 그 후에 해당 값을 42로 나누어서 나머지의 값을 담는다.

다음으로는 서로 다른 나머지를 구하기 위한 이중 for 문을 작성한다.

밖의 for 문을 [ i ] ,  안의 for 문을 [ j ] 라고 하자.

[ i ] 는 0부터 9까지 돌아가는 for 문이고 cnt 변수를 선언한다

[ j ] 는 i+1 즉, 1부터 9까지 돌아가는 for 문이고 이 안에 if 문을 추가하여 arr 배열 안에 동일한 값이 있는지를 확인한다.

동일한 값이 있으면, cnt 의 개수를 하나씩 증가시킨다.

[ j ] 가 끝난 후에 cnt의 개수가 0이면 즉, 동일한 값이 없으면 count 를 하나씩 증가시키는 if 문을 추가한다.

  • 즉, [ i ] for 문을 돌면서 [ j ] for문을 통해 동일한 값의 여부를 비교해주고, 동일한 값이 없다면 서로 다른 값을 의미하는 것이기 때문에 count의 개수를 추가해준다는 것이다.  

마지막으로 결과값인 count를 출력해준다. 

 

답안 소스 - 이중 for 문과 배열

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[] arr = new int[10];
		int count = 0;
		
		for(int i=0; i<10; i++) {
			arr[i] = Integer.parseInt(br.readLine()) % 42;
		}
		
		for(int i=0; i<10; i++) {
			int cnt = 0;
			for(int j=i+1; j<10; j++) {
				if(arr[i] == arr[j]) {
					cnt++;
				}
			}
			
			if(cnt == 0) {
				count++;
			}
		}
		System.out.println(count);
	}

}

Boolean 과 배열

boolean 자료형은 true / false 라는 결과값만을 가지고 있다.

이러한 특성을 이용해서 마치 인덱스처럼 활용하여 풀어볼 것이다.

 

선언할 변수 목록은 다음과 같다.

  • 0부터 41까지의 값이 들어있는 배열 [ bolean ]
  • bolean 배열의 값들을 넣어 true / false 를 비교할 변수 [ value ]
  • 서로 다른 나머지의 개수를 담을 변수 [ count ]

 

먼저, boolean 자료형의 배열 [ bolean ] 을 선언한다.

이 배열의 크기가 42인 이유는, 42 나누었을 때 나올 수 있는 0~41까지의 값을 담기 위해서이다.

boolean 자료형의  default 값은 false 이므로, 입력받은 값을 42로 나누어서 나오는 나머지 값들을 true 라고 선언한다.

이렇게 되면 배열 안에 들어간 42개의 값들 중, 입력받은 값들의 나머지가 나온 값은 true로, 나오지 않은 값은 false 로 저장되게 된다.

  • 예를 들어 나머지가 1, 3, 11, 5 가 나왔다고 가정하면 이 4개를 제외한 모든 값들은 false 값을 가지고 있는 것이다.

또한 boolean 을 사용하여 42개의 값들을 마치 인덱스처럼 사용하게 되므로 자연스레 중복 문제도 해결되게 된다.

무슨 말인지 자세히 알아보자면

  • 만약 1, 2, 5, 1 이라는 값이 나머지로 나왔다고 가정해보자. 여기서 1이라는 숫자는 맨 처음에 이미 'true' 라는 값이 저장된 상태이다.
  • 이 상태에서 나중에 1이 중복되어 들어온다고 하여도 결과적으로 1의 값은 true 가 되는 것이다.

즉, 몇 번을 반복해서 나온다고 해도 한 번이라도 해당 나머지 값이 들어온 적이 있다면 true 라는 하나의 결과만 저장된다는 것이다.

이를 이용하여 서로 다른 나머지의 수를 출력해보자.

향상된 for 문을 사용하여 [ bolean ]  배열에 들어간 true / false 값들을 value 라는 boolean 자료형의 변수에 넣어준다.

그리고 그 안에 if 문을 넣어서 value가 true 라면 count 를 하나씩 증가시켜주도록 한다.

이 말은 나머지 값이 들어갔다면 그 값들의 수를 중복이 제거된 상태로 count 한다는 의미이다.

 

마지막으로 결과값인 count를 출력해준다. 

 

답안 소스 - Boolean 과 배열

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));
		
		boolean[] bolean = new boolean[42];
		int count = 0;
		
		for(int i=0; i<10; i++) {
			bolean[Integer.parseInt(br.readLine()) % 42] = true;
		}
		
		for(boolean value : bolean) {
			if(value) {
				count++;
			}
		}
		System.out.println(count);
	}
}

HashSet 클래스

HashSet 란 Set 인터페이스의 구현 클래스로 Set 의 속성들을 그대로 물려받는다.

그 중에서 이 문제에 유용하게 쓰이는 속성은 다음과 같다.

  • 중복된 객체를 저장할 수 없다.

이것이 의미하는 것은 HashSet 을 이용해서 배열을 만들면 자동으로 중복이 제거되어 저장되므로 결과적으로 해당 배열에 들어간 값의 수를 출력해주면 된다는 것이다.

 

먼저 HashSet 을 사용해서 Integer 형의 값들을 저장할 배열 [ hs ] 를 선언한다.

그리고 0부터 9까지 돌아가는 for 문 안에 add() 메소드를 사용하여 입력받은 값을 42로 나눈 나머지 값들을 저장한다.

  • HashSet의 add() 메소드는 HashSet에 값을 저장하고, HashSet에 존재하면 true, 존재하지 않으면 false를 반환한다.

마지막으로 size() 메소드를 사용하여 결과값을 출력해준다.

  • HashSet의 size() 메소드는 HashSet 의 크기를 구해준다.

 

답안 소스 - HashSet 클래스

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

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.println(hs.size());
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[8958]OX퀴즈  (0) 2021.08.01
[1546]평균  (0) 2021.08.01
[2577]숫자의 개수  (0) 2021.07.25
[2562]최댓값  (0) 2021.07.22
[10818]최소, 최대  (0) 2021.07.21