※개인 공부 목적의 정리글입니다.
이 글의 내용이 최선의 해답은 아닐 수 있습니다.
문제
두 자연수 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이 아니라는 것은 한번이라도 나머지 값으로 나온적이 있는 지점이기 때문이다.
이런 단순한 문제도 더 쉽거나 좋게 풀 수 있는 방법이 있다는 것을 느꼈다.
댓글