백준 17255 N으로 만들기 java
1. 문제에 대하여 📦
- 수가 주어진다.
- 하나의 자릿수에서 출발하여 일의 자리 숫자를 그것의 왼쪽이나 오른쪽에 붙여나간다.
- 이떄 N을 만들 수 있는 경우의 수는?
(1) 조건 분석 📊
단 숫자를 적는 과정에서 나온 수가 순서대로 모두 같다면 같은 방법이라고 친다.
즉
즉
9111을 만들 때, 1 -> 11 -> 111 -> 9111 으로 어디서 시작했든 9111을 만드는 과정이 다음과 같다면 다 같은 경우의 수이다.2. 코드가 나오기까지 🛠️
KEY WORD: 시뮬레이션, DFS, 투 포인터- N의 모든 자릿수를 시작점으로 DFS를 진행
- 왼쪽이나 오른쪽으로 수를 늘려나간다.
- 2번에서 dfs를 거칠 때마다 모든 경로를 StringBuilder를 활용해 기록해놓는다. 이후 StringBuilder에 적힌 과정을 Set에 저장한다. (중복된 과정 제거 위함)
- set의 size가 답이다.
(1) 시간복잡도 분석 ⏳
각 경우의 수마다 N을 찾는 DFS의 횟수가 다르므로, 대략적인 값으로 구한다.
N의 자릿수 개수를
어느 자릿수에서 시작했든 왼쪽을 고를거냐, 오른쪽을 고를거냐를 C-1까지 반복한다. 이 행위를 모든 자릿수마다 함으로 시간복잡도는 다음과 같다.
C라 할 때,어느 자릿수에서 시작했든 왼쪽을 고를거냐, 오른쪽을 고를거냐를 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으로 풀어야한다.ㅏ