알고리즘 공부/백준
2309번 일곱난쟁이 with Java
당장하자
2022. 10. 24. 23:46
문제
https://www.acmicpc.net/problem/2309
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
해결한 방법
문제설명 그대로 직관적인 방법입니다. 숫자의 합이 100일때를 찾아서 정렬후 출력하는 방법입니다.
1. 가능한 모든 경우의 수에서 7개의 숫자를 더한 결과가 100이 되는 경우를 찾습니다.
2. 그 때 7개 외의 두 수를 0으로 바꿉니다.
3. 정렬을 하면 0은 맨앞으로 올테니 출력은 3번째 숫자부터 9번째 숫자까지 해줍니다.
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int[] inputList = new int[9];
for (int i = 0; i < 9; i++) {
inputList[i] = sc.nextInt();
}
int sum;
boolean break_flag = false;
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 9; j++) {
sum = 0;
for (int k = 0; k < 9; k++) {
if (k != i && k != j) {
sum += inputList[k];
}
}
if (sum == 100){
inputList[i] = inputList[j] = 0;
Arrays.sort(inputList);
break_flag = true;
break;
}
}
if (break_flag) break;
}
for (int i = 2; i < 9; i++) {
System.out.println(inputList[i]);
}
}
}
새로 배운 방법
1) 7개의 합이 100일때가 아니라 9개의 합에서 두 수를 뺏을때 100이 나올때를 찾았습니다.
- for문 하나를 줄일 수 있어서 큰 개선점이 되었습니다.
2) 입력을 Scanner가 아니라 BufferedReader로 받았습니다.
- buffer에 모아서 출력하는게 이렇게 유의미한 차이를 낼 줄 몰랐습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] inputList = new int[9];
int sum = 0;
for (int i = 0; i < 9; i++) {
inputList[i] = Integer.parseInt(br.readLine());
sum += inputList[i];
}
boolean break_flag = false;
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 9; j++) {
if (sum - inputList[i] - inputList[j] == 100) {
inputList[i] = 100;
inputList[j] = 100;
break_flag = true;
break;
}
}
if (break_flag) break;
}
Arrays.sort(inputList);
for (int i = 0; i < 7; i++) {
System.out.println(inputList[i]);
}
}
}
java 11로 제출했는데 java 8로 제출하니 70ms 정도로 확 줄었습니다. 왜 그런지 궁금해지네요.
새로 배운 방법은 https://www.acmicpc.net/source/8205814에서 배운 방법입니다.