문제.
매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.
어느 날 광산에서 아홉 난쟁이가 돌아왔다. (왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.
백설공주는 이런 일이 생길 것을 대비해서, 난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.
아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. (아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)
입력.
총 아홉개 줄에 1보다 크거나 같고 99보다 작거나 같은 자연수가 주어진다. 모든 숫자는 서로 다르다. 또, 항상 답이 유일한 경우만 입력으로 주어진다.
출력.
일곱 난쟁이가 쓴 모자에 쓰여 있는 수를 한 줄에 하나씩 출력한다.
정답.
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = 0;
int S = 0;
int a = 0;
int b = 0;
int x = 0;
int[] kiz = new int[9];
int[] realKiz = new int[7];
for(int i = 0; i < 9; i++){
int k = sc.nextInt();
S += k; // 9개의 합.
kiz[i] = k;
}
n = S - 100;
for(int i = 0; i < 9; i++){
for(int j = i+1; j < 9; j++){
if (n == kiz[i] + kiz[j]) {
a = kiz[i]; //기준
b = kiz[j]; // 돌리는수
}
}
}
for(int i = 0; i < 9; i++){
if(kiz[i] != a && kiz[i] != b){
realKiz[x] = kiz[i];
x++;
}
}
//Arrays.sort(realKiz);
for(int i =0 ; i < 7; i++) {
System.out.println(realKiz[i]); // 0이 7개
}
}
}
한줄리뷰.
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = 0;
int S = 0;
int a = 0;
int b = 0;
int x = 0;
int[] kiz = new int[9]; // 아홉 난쟁이 모두를 받는 배열
int[] realKiz = new int[7]; // 추후 걸러서 일곱 난쟁이만 받을 배열
for(int i = 0; i < 9; i++){ // scanner을 통해 k변수에 9번 입력을 받음
int k = sc.nextInt();
S += k; // 9개의 합. // 9개의 합을 S라 하고 S - 100 = N 이때 N의 값은 두정수를 더했을 때 나오므로 두 정수 값만 찾으면됨
kiz[i] = k; //kiz 배열에 모든 입력값을 넣음
}
n = S - 100; // N값을 구함
for(int i = 0; i < 9; i++){ // 총 아홉개의 정수에서 서로 짝을 한번씩 다 짓을 때 n값이 나오는 숫자를 찾아야하므로 9x9=36가지 경우의 수를 따져야 함
for(int j = i+1; j < 9; j++){ // [0, 0] [0, 1] 이 아니고 [0, 1] [0,2] 부터 시작해야 하므로 두번째 for문은 i + 1;을 해줌
if (n == kiz[i] + kiz[j]) { // 이때 kiz[i]+ kiz[j]가 n과 같을 때
a = kiz[i]; // a변수에 저장
b = kiz[j]; // b변수에 저장
}
}
}
for(int i = 0; i < 9; i++){ //이제 찾은 두 정수를 걸러서 realkiz[]배열에 넣어야함 진짜 신데렐라 난쟁이를 찾아 주는 시간
if(kiz[i] != a && kiz[i] != b){ // kiz[](나쁜난쟁이까지 섞여있는)배열을 돌면서 아까 찾은 두 정수를 연산자를 통해 if문을 걸음. a가 아니고 b도 아닌 것들만
realKiz[x] = kiz[i]; // realKiz[]배열에 넣어준다 근데 이때 아닐때는 if문을 벗어날 텐대 realKiz가 [i]변수를 갖고 순환한다면 realkiz 배열인덱스에 공백이 생김으로. x변수를 따로 두어 카운트해주고 참일시에만 x++로 증가시켜줌
x++;
}
}
//Arrays.sort(realKiz);
for(int i =0 ; i < 7; i++) { // 진짜 난쟁이들 출력.
System.out.println(realKiz[i]); /
}
}
}
'백준' 카테고리의 다른 글
| [백준]1476번 날짜 계산 | Java (0) | 2025.07.15 |
|---|---|
| [백준] 7785번 회사에 있는 사람 | Java (2) | 2025.07.10 |
| [백준] 27866번 제로 | Java (1) | 2025.07.09 |
| [백준] 8958번 OX퀴즈 | Java (0) | 2025.07.02 |
| [백준] 2501번 약수 구하기 | Java (0) | 2025.06.27 |