https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

코딩 테스트 준비를 위한 브루트 포스 문제 푸는 도중에 생긴 실수이다.

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner kb = new Scanner(System.in);
		int nan[] = new int[9];
		int sum = 0;
		
		for(int i=0;i <nan.length; i++) {
			nan[i] = kb.nextInt();
			sum += nan[i];
		}
		
		int minus = sum-100;
		
		for(int i=0; i<nan.length; i++) {
			for(int j=0; j<nan.length; j++) {
				if(i==j) {
					continue;
				}
				if(nan[i]+nan[j] == minus) {
					nan[i] = 0;
					nan[j] = 0;
					break;
				}
			}
		}
		Arrays.sort(nan);
		for(int i=2; i<nan.length; i++) {
			System.out.println(nan[i]);
		}
	}	
}

기존의 나의 코드이다.

 

1. 9명의 난쟁이들의 키를 담을 배열 과

난쟁이 들의 키를 합산할 변수를 선언한다.

 

2. 입력을 받음과 동시에 합산한 변수를 얻어낸다.

 

3. 문제에서 일곱 난쟁이들의 키의 합은 100이라고 주어졌으므로

합산결과에서 100을 뺀 변수를 저장

 

4. 중첩 반복문을 통해 i j 가 같을때는 넘어가게한다. 이때 i번째 값과 j번째 값의 합이

합산에서 100을 뺀 변수와 같다면 0으로 초기화 후 반복문을 탈출한다.

 

5. 정렬한다.

 

6. 인덱스 2번부터 출력한다.

 

예제입력 1

20 7 23 19 10 15 25 8 13 을 입력하면

 

출력에서 원하는 기대값을 얻을 수 있다.

하지만 제출해보니 틀렸다고 되어버린다.

 


 

이때 반례를 찾아보니 나의 잘못을 알게되었다.

 

만일 

7

8

10

13

19

20

23

11

12 가 주어진다고 하면

 

10 ,13 에서 반복문이 끝나야 한다. 하지만 끝나지않고 0으로 초기화 하고 반복문이 돌아버리면서

23을 만나며 23마저 0으로 초기화가 된다. 이 중첩 반복문 전체를 종료하지 않아서 생긴 문제이다.

 

이런 경우에 boolean 자료형을 써봐야 겠다고 생각하여

작성해보았는데 

		boolean finish = true;

		for(int i=0;finish==false; i++) {
			for(int j=0; j<nan.length; j++) {
				if(i==j) {
					continue;
				}
				if(nan[i]+nan[j] == minus) {
					nan[i] = 0;
					nan[j] = 0;
					finish = false;
					break;
				}
			}		
		}

finish 라는 변수를 두고 이 값이 안쪽에서 false로 만들어주고 이값이 false라면 종료하게끔 만들려고했는데

애초에 바깥쪽 반복문을 타지도 못하게되었다... 생각이 짧았네..ㅋㅋㅋㅋ

 

 

다른 방법이 있나 찾아보니 라벨을 붙여주는 방식도 있다는 것을 알게되었다.

Loop1:
		for(int i=0;i<nan.length; i++) {
			Loop2:
			for(int j=0; j<nan.length; j++) {
				if(i==j) {
					continue;
				}
				if(nan[i]+nan[j] == minus) {
					nan[i] = 0;
					nan[j] = 0;
					break Loop1;
				}
			}		
		}

 

		boolean finish = false;
		
		for(int i=0;finish==false; i++) {
			for(int j=0; j<nan.length; j++) {
				if(i==j) {
					continue;
				}
				if(nan[i]+nan[j] == minus) {
					nan[i] = 0;
					nan[j] = 0;
					finish = true;
					break;
				}
			}		
		}

불린 형식데이터를 자주 써보며 항상 좋고 이쁜코드를 짜고싶다 !!

반복문의 조건을 항상 멈출때에 초점을 맞추다보니 이런 실수가 생겼다.

더 성장하여 좋은 개발자가 되고싶다.

+ Recent posts