알고리즘 문제풀이/백준-오답노트

오답노트 #4436 : 엘프의 검

모항 2022. 11. 22. 17:18

풀이방법 및 문제점

2022.11.22

사용한 방법은 다음과 같다.

0부터 9까지의 숫자가 담겨있는 해시셋을 선언한다.

수열에 특정 숫자가 나타날 때마다 그 숫자를 해시셋에서 remove()한다.

해시셋이 텅 비게 되면 그 시점의 k를 출력한다.

형변환의 번거로움을 줄이기 위해 각 숫자는 int나 long이 아닌 Character형으로 하였다.

 

완벽한 풀이법이라고 생각했는데 33퍼센트에서 자꾸 틀렸습니다를 받는다.

 

무엇이 문제지...?

 

친구가 한 것처럼 boolean 배열이 모두 true가 되었을 때 정답을 확정하는 코드도 짜보았는데, 똑같이 33퍼센트에서 틀렸습니다를 받았다.

이걸 보니 풀이법 자체가 문제가 아닌 것 같다. 친구가 했을 때 정답 처리를 받은 코드를 내 식으로 짜보니 오답 처리가 되었기 때문이다! 내가 코드로 구현하는 과정에서 실수를 하여 특정 테스트케이스를 놓치고 있는 것 같다... 대체 뭘까? 너무 간단한 문제라 알아내기가 더 어렵다.

 

초기화가 문제인가?

아니다. n, k, 해시셋 모두 매 입력값마다 잘 초기화해주고 있다.

 

입력을 잘못 받아오고 있나?

아니다. 놓치는 입력값도 없고, 입력이 더이상 들어오지 않을 때까지 while문이 돌도록 잘 해놓았다.

 

자료형이 문제인가?

아니다. 숫자들은 long으로 잘 선언해서 범위 초과가 일어나지 않았고, 숫자와 문자간 형 불일치도 없다.

 

k의 값 증가를 잘못 해주고 있나?

아니다. 초기값을 0으로 설정해준 뒤, 각 계산의 첫머리에서 1씩 증가하도록 하였다. 올바르게 증가하고 있다.

 

정답 k를 구하는 타이밍이 틀렸나?

아니다. 계산의 첫머리에서만 k가 1 증가하고, 그렇게 증가된 k로 한 계산 때문에 HashSet이 텅 비면 즉시 현재의 k를 출력하게 해놓았다. 그럼 올바른 정답 값이 나온다.

 

 

 

 

아... 문제가 무엇인지 알아냈다...

정답 k를 출력할 때에

println() 을 써야 하는데 print() 를 써서 틀린 거였다... 하...........................

 

정답 게시글 바로가기

 

 

 

 

 

코드

Java(2022.11.22)

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

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String input = null;
		
		while((input=br.readLine()) != (null)) {
			long n = Long.parseLong(input);
			
			HashSet<Character> hs = new HashSet<Character>();
			for(int i=0; i<10; i++) hs.add((char)(i+'0'));
			
			long k = 0;
			while(true) {
				k++;
				String str = Long.toString(k*n);
				for(int i=0; i<str.length(); i++) hs.remove(str.charAt(i));
				if(hs.isEmpty()) break;
			}
			
			System.out.print(k);
		}
		
	}

}