Problem Solving
[백준/Java] 3052번 - 42로 나눈 나머지 가짓수 세기
Jintiago
2022. 3. 27. 18:37
10개의 0 이상의 정수가 입력되었을 때, 각각을 42로 나눌 경우 도출되는 나머지의 가짓수를 세어야 하는 문제다.
접근 방법은 이렇다.
1. 어떠한 수를 42로 나누었을 때 나머지는 0~41
2. 길이가 42인 배열의 인덱스(0~41)에 나머지를 대응하여 해당 인자에 +1
3. 배열의 인자가 0이 아닐 경우 새로운 변수 count에 +1
4. count 출력
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] array = new int[42]; // 42로 나눈 나머지 넣을 배열
int num;
for (int i=0;i<42;i++) // 배열 인자 0으로 초기화
array[i] = 0;
for (int i=0;i<10;i++) {
num = Integer.parseInt(br.readLine()); // 입력된 숫자 읽기
array[num%42]++; // 나머지의 크기에 따라 배열의 해당 인덱스에 1씩 추가(체크)
}
// 나머지가 몇 가지인지 세기
int count = 0;
for (int i=0;i<42;i++) {
if (array[i] != 0)
count++;
}
System.out.println(count);
}
}
하지만 이 코드의 경우, 같은 크기의 나머지가 여럿 나온다면 이것은 메모리와 시간의 낭비를 불러올 것이다.
우리가 원하는 것은 어떠한 나머지가 존재하느냐 그렇지 않느냐지 몇 개 존재하는지가 아니기 때문이다.
그래서 개선해 보았다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] array = new int[42];
int num;
for (int i=0;i<42;i++)
array[i] = 0;
for (int i=0;i<10;i++) {
num = Integer.parseInt(br.readLine())%42;
if (array[num] != 0) // 해당 나머지가 이미 세어졌는지 검사
continue;
else
array[num]++;
} // array 의 인자는 모두 0 또는 1이 된다
int count = 0;
for (int i=0;i<42;i++)
count += array[i]; // 인자의 합 == 나머지의 가짓수
System.out.println(count);
}
}
예상과 달리 코드 길이 말고 별 차이가 없다...ㅎ 만약 같은 나머지만 주어지는 상황이라면 차이가 날 수도 있지 않을까? 라고 생각해 본다.