728x90
반응형
✅문제설명
왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.
✅입출력 예
✅입출력 예 설명
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
💡내가 생각한 풀이
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[9];
int sum = 0;
for (int i=0; i<9; i++){
arr[i] = sc.nextInt();
}
for (int a:arr){
sum += a;
}
int sub = sum - 100;
int d1 = 0;
int d2 = 0;
Arrays.sort(arr);
for(int i=0; i<9; i++){
for(int j=i+1; j<9; j++){
if(arr[i] + arr[j] == sub){
d1 = i;
d2 = j;
break;
}
}
}
for(int i=0; i<9; i++){
if(i != d1 & i != d2){
System.out.println(arr[i]);
}
}
}
}
💡다른 사람 풀이
package 완전탐색;
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class P2309_일곱난쟁이 {
public static void main(String[] args) throws IOException {
/* 입력 변수 선언 */
Scanner sc = new Scanner(System.in);
/* 9명 난쟁이들의 키 입력 */
int size = 9;
int[] dwarf = new int[size];
int target = 0; // 난쟁이 9명 키의 전체 합
for(int i=0; i<size; i++) {
dwarf[i] = Integer.parseInt(sc.next());
target += dwarf[i];
}
/* 가짜 난쟁이 2명의 키의 합 계산 */
target -= 100;
/* 가짜 난쟁이 2명 찾기 */
int d1 = 0;
int d2 = 0;
Arrays.sort(dwarf); // 오름차순 정렬 (나중에 가짜 난쟁이의 인덱스를 받기 때문에 미리 정렬)
for(int i=0; i<size-1; i++) {
for(int j=i+1; j<size; j++) {
if(dwarf[i] + dwarf[j] == target) {
d1 = i;
d2 = j;
break;
}
}
}
/* 진짜 난쟁이 출력 */
for(int i=0; i<size; i++) {
if(i == d1 || i == d2) continue;
System.out.println(dwarf[i]);
}
}
}
💡새로 알게된 개념
'break'와 'break outerLoop'의 차이점
break
break는 가장 안쪽에 있는 현재 루프를 탈출하는 데 사용됩니다. 만약 중첩 루프 내에서 break를 사용하면, break가 위치한 가장 안쪽 루프만 종료됩니다.
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j == 2) {
break; // 가장 안쪽 루프(j loop)만 종료
}
System.out.println("i: " + i + ", j: " + j);
}
}
위 코드에서는 j가 2일 때 break가 실행되어 j 루프가 종료되고 i 루프는 계속 진행됩니다.
break outerLoop;
break outerLoop;는 레이블이 지정된 루프를 탈출하는 데 사용됩니다. 중첩 루프 내에서 특정 바깥쪽 루프까지 제어를 즉시 이동시킬 수 있습니다.
outerLoop: // 레이블 지정
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j == 2) {
break outerLoop; // outerLoop 레이블이 지정된 루프를 탈출
}
System.out.println("i: " + i + ", j: " + j);
}
}
위 코드에서는 j가 2일 때 break outerLoop;가 실행되어 outerLoop 레이블이 지정된 i 루프가 종료됩니다. 따라서 i 루프와 j 루프 모두 탈출하게 됩니다.
이 break outerLoop를 내 코드의 활용한다면 조금 더 효율적인 코드로 바꿀 수 있다.
728x90
반응형