백준 17255 N으로 만들기 java

Nov 16, 2025
백준 17255 N으로 만들기 java

1. 문제에 대하여 📦

  1. 수가 주어진다.
  1. 하나의 자릿수에서 출발하여 일의 자리 숫자를 그것의 왼쪽이나 오른쪽에 붙여나간다.
  1. 이떄 N을 만들 수 있는 경우의 수는?

(1) 조건 분석 📊

단 숫자를 적는 과정에서 나온 수가 순서대로 모두 같다면 같은 방법이라고 친다.
9111을 만들 때, 1 -> 11 -> 111 -> 9111 으로 어디서 시작했든 9111을 만드는 과정이 다음과 같다면 다 같은 경우의 수이다.

2. 코드가 나오기까지 🛠️

KEY WORD: 시뮬레이션, DFS, 투 포인터
  1. N의 모든 자릿수를 시작점으로 DFS를 진행
  1. 왼쪽이나 오른쪽으로 수를 늘려나간다.
  1. 2번에서 dfs를 거칠 때마다 모든 경로를 StringBuilder를 활용해 기록해놓는다. 이후 StringBuilder에 적힌 과정을 Set에 저장한다. (중복된 과정 제거 위함)
  1. set의 size가 답이다.

(1) 시간복잡도 분석 ⏳

각 경우의 수마다 N을 찾는 DFS의 횟수가 다르므로, 대략적인 값으로 구한다.
N의 자릿수 개수를 C라 할 때,
어느 자릿수에서 시작했든 왼쪽을 고를거냐, 오른쪽을 고를거냐를 C-1까지 반복한다. 이 행위를 모든 자릿수마다 함으로 시간복잡도는 다음과 같다.
O(C2C1) O(C * 2^{C-1})

3. 코드 🌐

(1) SUDO CODE 💬

1. N의 모든 자릿수를 시작점으로 DFS를 진행 2. 왼쪽이나 오른쪽으로 수를 늘려나간다. 3. 2번에서 dfs를 거칠 때마다 모든 경로를 *StringBuilder*를 활용해 기록해놓는다. 이후 StringBuilder에 적힌 과정을 Set에 저장한다. (중복된 과정 제거 위함) 4. set의 size가 답이다.

(2) JAVA CODE ☕

import java.util.*; import java.io.*; // b 17255 N으로 만들기 public class Main { static char [] values; static int N; static HashSet<String> set = new HashSet<>(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); values = br.readLine().toCharArray(); N = Integer.parseInt(String.valueOf(values)); for(int i = 0; i < values.length; i++){ dfs(i,i,String.valueOf(values[i]), new StringBuilder().append(values[i])); } System.out.println(set.size()); } public static void dfs(int L, int R, String now, StringBuilder path){ if(L == 0 && R == values.length-1) { set.add(path.toString()); return; } StringBuilder next = new StringBuilder(); if(L-1 >= 0){ StringBuilder newOne = new StringBuilder().append(path); next.append(values[L-1]).append(now); newOne.append("->").append(next); dfs(L-1, R, next.toString() ,newOne); } next.setLength(0); if(R+1 < values.length){ StringBuilder newOne = new StringBuilder().append(path); next.append(now).append(values[R+1]); newOne.append("->").append(next); dfs(L, R+1, next.toString(), newOne); } } public static int findDigit(int v){ if( v == 0) return 1; return (int)Math.log10(v) + 1; } }

4. 트러블 슈팅 or 배운 점📝

int로 풀려다가 실패한 것

int로 과정에서의 숫자를 표현하면 8 -> 08 표현이 안된다. 따라서 전체 다 String으로 풀어야한다.ㅏ