문제 풀이/백준
[백준] 1342번. 행운의 문자열(JAVA)
27200
2025. 6. 9. 18:12
문제
https://www.acmicpc.net/problem/1342
풀이(15분)
import java.util.*;
import java.io.*;
public class Main {
static Set<Character> alphabet = new HashSet<>(); // 사용될 알파벳 집합
static int[] alphabetCount = new int[26]; // 알파벳의 개수를 체크할 배열
static int count, stringLength; // 정답 개수와 문장의 길이
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String s = br.readLine();
stringLength = s.length();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
alphabet.add(c); // 집합에 추가
alphabetCount[c - 'a']++; // 배열에 카운트 + 1
}
for(char c : alphabet){
dfs(c, 1);
}
System.out.println(count);
}
static void dfs(char lastAlphabet, int length){
if(length == stringLength){
count++;
return;
}
alphabetCount[lastAlphabet - 'a']--;
for(char c : alphabet){
if(c != lastAlphabet){
if(alphabetCount[c - 'a'] != 0){
dfs(c, length+1); // dfs 깊이 1 추가
}
}
}
alphabetCount[lastAlphabet - 'a']++;
}
}
문제 풀이 전략
전략 자체는 단순하다. 길이가 10인 짧은 문자열을 대상으로 하는 것이기 때문이다.
1. 알파벳의 개수와 종류를 체크한다.
2. 알파벳을 하나 선택한다.
3. 사용 가능한 알파벳의 개수에서 뺀다.
4. 이 전 알파벳과 다르게 사용할 수 있는 게 있다면 dfs를 반복한다.
5. 최종적으로 길이가 문자열과 같아졌다면 종료하고 정답을 + 1 한다.
6. 감소한 알파벳을 증가시킨다.