알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net


Think🤔

내가 생각하는 방법

 

문제를 분석해보면, 일곱 난쟁이가 와야하는데 아홉 난쟁이가 와서 두명의 난쟁이는 제외 시키고 오름차순으로 출력해줘야 한다.

 

아홉 난쟁이에서 두명을 뺄때는 가장 큰 두명의 난쟁이를 제외시킨다.

 

배열로 받을 때, 총 9개의 난장이를 받아서 비교하려고 한다.

 

가장 쉽게 푸는 방법은 9개를 받아서 정렬하고 7개만 나오게하면 된다.

 

package back22y01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class sevenSmall {
	
	public static void main(String[] args) {
		
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			// 다 받는데 이제 compare로 비교해서 작은거 부터 출력해줘야함
			int[] arr = new int[9];
			
			for(int i =0; i< arr.length; i++) {
				arr[i] = Integer.parseInt(br.readLine());
			}
			
			Arrays.sort(arr);
			
			for(int i =0; i<7; i++) {
				System.out.println(arr[i]);
			}
			
		} catch (IOException e) {
			System.out.println("입출력 예외발생 : " + e.getMessage());
		} catch (Exception e) {
			System.out.println("예외발생 : " + e.getMessage());
		}
	}
}

틀렸다..

 

왜 틀렸을까? 일단 한 번 풀어보고 리팩토링 하는 방법으로 가려고 했는데..

 

문제 조건에 주어지는 키는 100을 넘지 않아야한다.

 

지금 코드는 그냥 9명 뽑아서 작은거 부터 7명을 뽑는 코드이다.

 

sum이란 변수를 둬서 100인 것을 확인해야 한다.

 

조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법. 

브루트 포스 방법을 사용해 본다.

 

인덱스를 검사할 때, 반복문을 이용해서 먼저 나오는 인덱스와 그 다음 인덱스를 하나씩 대입해 보면서 찾는 방법이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main {
	
	public static void main(String[] args) {
		
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			// 다 받는데 이제 compare로 비교해서 작은거 부터 출력해줘야함
			int[] arr = new int[9];
			int sum = 0;
			
			for(int i=0; i< arr.length; i++) {
				arr[i] = Integer.parseInt(br.readLine());
				sum += arr[i];
				System.out.println(sum + " sum 값 ");
			}
			
			Arrays.sort(arr);
			
			for(int i=0; i<arr.length - 1; i++) { // 마지막 전까지
				for(int j=i+1; j<arr.length; j++) { // 다음꺼 부터 마지막 까지
					if(sum - arr[i] - arr[j] == 100) { // 합계에서 첫번쨰하고 다음꺼를 뺴서 100이면
						System.out.println(sum + " sum 걸림");
						System.out.println(arr[i] + " i 걸림 이때 i 값 : " + i);
						System.out.println(arr[j] + " j 걸림 이때 j 값 : " + j);
						for(int k=0; k<arr.length; k++) { // 반복문으로 난쟁이들 키가 100이면 가짜 난쟁이들은 continue로 넘어가야함
							if(i == k || j == k) {
								System.out.println("안에서 걸리는 arr[i] 값 " + arr[i]); // i는 4 작은거부터 5번째
								System.out.println("안에서 걸리는 arr[j] 값 " + arr[j]); // j는 8 작은거부터 8번째
								continue;
							}
							System.out.println(arr[k]);
						}
					}
				}
			}
			
		} catch (IOException e) {
			System.out.println("입출력 예외발생 : " + e.getMessage());
		} catch (Exception e) {
			System.out.println("예외발생 : " + e.getMessage());
		}
	}
}

System.out.print 콘솔처럼 찍은 부분 뺴고 지웠는데도 실패했다.

 

System.exit(0);이 없어서 그랬던 것이다.

정상적인 종료를 해줘야하는데, 그렇지 못해서 틀렸다고 나온것 같다.

 

왜 틀린걸까? 종료를 안시키면 시간이 초과가 돼서 틀린걸까?

break;로 바꿔서 테스트를 해본다..

 

틀렸다고 나온다 어디선가 비정상적인 종료가 일어났다는건데.. 

 

			for(int i=0; i<arr.length - 1; i++) { 
				for(int j=i+1; j<arr.length; j++) { // 다음꺼 부터 마지막 까지
					if(sum - arr[i] - arr[j] == 100) { // 합계에서 첫번쨰하고 다음꺼를 뺴서 100이면
						for(int k=0; k<arr.length; k++) { // 반복문으로 난쟁이들 키가 100이면 가짜 난쟁이들은 continue로 넘어가야함
							if(i == k || j == k) {
								continue;
							}
							count++;
							System.out.println(arr[k]);
							if(count == 7) {
								br.close();
							}
							
						}
					}
				}
			}

버퍼리더가 println되면서 오류가 난 것은 아닐까 해서

강제적으로 count로 7까지 세주고 br.close()로 닫아보기도 하고, 그 밑에 br.close() 또는 break;로 막아봤지만 

해결하지 못했다.

 

아무래도 비정상적으로 종료되는 코드인 것 같은데..

 

System.exit(0); 으로 정상종료 하면 맞은 코드인데 이유를 알아야 한다.


Solution✍

 


Review🤩

백준 클래스이름은 항상 "Main"!!

 

 


 

 

+ Recent posts