https://www.acmicpc.net/problem/status/3052/1002/1
문제
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
문제 접근 , 풀이 과정
10의 크기를 가진 배열과 입력 값을 계속 비교하여 배열에 동일한 값이 없으면 배열에 입력값을 넣는다.
import java.io.*;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//10개의 배열 생성
int N[] = new int[10];
//입력값은 모두 음이 아닌 정수이기 때문에 -1을 저장
for(int i = 0; i < N.length; i++)
N[i] = -1;
//배열의 길이만큼 훑고 만약 배열에 같은 입력값이 없다면 배열에 입력값 추가.
for(int i = 0; i< 10; i++) {
//tmp에 입력값을 42로 나눈 결과를 대입
int tmp = Integer.parseInt(bf.readLine())%42;
//boolean타입 t 변수에 true 대입.
boolean t = true;
//N배열을 훑어 입력값이 이미 있다면 false를 반환한다.
for(int j = 0; j < 10; j++) {
if(N[j] == tmp) {
t = false;
break;
}
}
//t가 false가 아닌 true라면 N[i]배열에는 입력값을 넣는다.
if(t == true)
N[i] = tmp;
}
//서로 다른 숫자를 저장하기 위한 변수 선언
int item = 0;
// N배열을 훑어 -1값이 아니라면 item은 1상승
for(int i = 0; i < 10; i++) {
if(N[i] != -1)
item++;
}
System.out.println(item);
}
}
배운점
for(int j = 0; j < 10; j++) {
if(N[j] == tmp) {
} else { --?-- }
}
위 코드에서
N배열을 훑어 입력값과 동일한 값이 있다면? 배열에 값을 대입하지 않고,
동일한 값이 없다면 값을 대입하고 싶었다.
하지만 N[j] == tmp가 성립 하지 않는다면 else가 실행되는 조건문이므로
N배열을 전부 훑고 대입할지 말지 판단하는 것이 아닌 조건이 성립할 때마다 대입하는 것이 된다.
이러면, 내가 원하는 바가 이루어 지지않는다. 여기서 해결방법이 없는가? 오래 고민했다.
이때 한가지 아이디어가 생각났다. boolean 타입을 사용하는 것이다.
위에서 말했듯이, N배열을 훑어 입력값과 동일한 값이 있다면 t변수에는 false가 저장 되고 배열에는 값이 저장되지 않는다.
//N배열을 훑어 입력값이 이미 있다면 false를 반환한다.
for(int j = 0; j < 10; j++) {
if(N[j] == tmp) {
t = false;
break;
}
}
항상 느끼는 것이지만 풀긴해도 깔끔하진 못하다고 생각이든다.
문제 푼 사람 중 순위권에 있는 사람의 코드 두개를 비교하였다.
public static void main(String args[]) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader);
HashSet<Integer> remainderSet = new HashSet<>();
for(int i=0; i<10; i++){
int input = Integer.valueOf(br.readLine());
remainderSet.add(input%42);
}
System.out.println(remainderSet.size());
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] arry = new int[10];
for (int i = 0; i < 10; i++) {
arry[i] = Integer.parseInt(br.readLine()) % 42;
}
Arrays.sort(arry);
int prev = arry[0];
int count = 1;
for (int i = 1; i < 10; i++) {
if (prev != arry[i]) {
count++;
}
prev = arry[i];
}
System.out.println(count);
br.close();
}