Backend
home
🔢

[백준] 수 이어 쓰기

생성일
2025/02/08 03:58
태그
BaekJoon
게시일
2025/02/08
최종 편집 일시
2025/02/08 04:06

문제

해결 방안 고민

처음에 문제가 잘 이해되지 않아서 꽤나 애를 많이 먹었던 문제다.
여러 가지로 생각을 해봤지만 구현을 어디서부터 해야 할지 막막했다.

해결 방법

다음 블로그를 참고하여 문제를 겨우 해결할 수 있었다.
입력으로 주어지는 수가 최대 3000자리, 0~9 까지의 숫자는 10개이므로 3000 * 10 = 30000 이내에서 모두 찾을 수 있다.
방법
base를 1로 잡아서 1부터 30000까지 고려해야 한다.
여기서 base는 String으로 선언한다. 테스트 케이스에서 굉장히 긴 길이의 숫자를 입력하는 것을 고려하기 위함이다.
pointer 변수를 선언하여 base와 비교한다.
pointer와 동일하면 base를 증가시킨다.
base가 두 자리 이상의 숫자인 경우 해당 수를 [1, 0] 형태와 같이 나누어서 숫자 하나씩 비교한다. pointer와 동일하면 base를 증가시킨다.
pointer 가 입력한 숫자의 일의 자리까지 비교가 끝나면 loop를 빠져 나간다. 그리고 최종적으로 확인된base를 출력한다.

코드

package algo250208; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.io.IOException; import java.io.InputStreamReader; // 수 이어 쓰기 - 실버 3 /* 입력으로 주어지는 수: 최대 3000자리 0~9까지는 10개 => 3000 * 10 = 30000 이내에서 모두 찾아질 것임 */ public class Baek1515 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String number = br.readLine(); int pointer = 0; String base = null; loop: for (int i = 1; i < 30000; i++) { base = String.valueOf(i); // base = 1 선언 (1부터 N까지 모든 수를 차례대로 입력) int length = base.length(); for (int j = 0; j < length; j++) { // pointer와 비교 if (number.charAt(pointer) == base.charAt(j)) { // base와 pointer의 숫자가 동일하면 pointer 증가 pointer++; } // pointer와 입력한 숫자의 길이가 같으면 이중 for 문 루프 빠져나가기 if (pointer == number.length()) { break loop; } } } bw.write(base); bw.flush(); bw.close(); br.close(); } }
Kotlin
복사