알고리즘
[백준/자바] #6443
룰루루
2025. 6. 13. 15:11
방법은 대략 생각났다. python으로 이 문제를 풀었을 때는 sorted word의 각 character가 몇 번 등장하는지를 담은 dictionary 변수를 만들고, 재귀함수로 해당 변수에서 알파벳의 count를 뺐다가 더했다가 하면서 값을 구했던 걸로 기억한다.
그런데 똑같은 방법을 java로 쓰려니 구체적인 구현 방법이 잘 생각나지 않았다. 30분이 지나도 진척이 없어서 다른 풀이를 참고했다. 아쉬운 마음에 풀다 만 코드라도 올려본다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
class Main {
static int N;
static char[] words;
static Map<Character, Integer> wordDictionary;
static BufferedWriter bw;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine().strip());
for(int i=0; i<N; i++) {
words = br.readLine().strip().toCharArray();
makeWordDictionary(words);
char currentChar = words[0];
char[] initialCharArray = {words[0]};
wordDictionary.put(currentChar, wordDictionary.get(currentChar) - 1);
makeAnagram(initialCharArray);
wordDictionary.put(currentChar, wordDictionary.get(currentChar) + 1);
}
br.close();
bw.flush();
bw.close();
}
private static void makeWordDictionary(char[] sortedWordArray) {
wordDictionary = new HashMap<>();
for(int i=0; i<sortedWordArray.length; i++) {
char currentChar = sortedWordArray[i];
if (wordDictionary.containsKey(currentChar)) {
wordDictionary.put(currentChar, wordDictionary.get(currentChar) + 1);
} else {
wordDictionary.put(currentChar, 1);
}
}
}
private static void makeAnagram(char[] sortedWordArray) throws IOException {
if(sortedWordArray.length == words.length) {
bw.write(new String(sortedWordArray) + "\n");
return;
}
}
}
여기서 Stack을 사용해보고, 매번 쓰는 BufferedWriter 대신에 StringBuilder도 사용해볼 수 있었다. 새삼 java로 코딩테스트를 많이 안 풀어본지라 생소한 부분이 꽤 있었다.
다른 풀이를 참고해서, 아래와 같이 코드를 작성해 봤다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
class Main {
static int N;
static char[] word;
static int[] wordDictionary;
static Set<String> set;
static Stack<Character> stack;
static StringBuilder answerSb;
static int ALPHABET_COUNT = 26;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
answerSb = new StringBuilder();
N = Integer.parseInt(br.readLine().strip());
for(int i=0; i<N; i++) {
set = new TreeSet<>();
stack = new Stack<>();
word = br.readLine().toCharArray();
wordDictionary = new int[ALPHABET_COUNT];
for(char ch : word) {
wordDictionary[ch - 'a'] += 1;
}
combination();
set.stream().forEach(s -> answerSb.append(s + "\n"));
}
System.out.println(answerSb.toString());
br.close();
}
private static void combination() {
if (word.length == stack.size()) {
StringBuilder wordSb = new StringBuilder();
for(char ch : stack) {
wordSb.append(ch);
}
set.add(wordSb.toString());
return;
}
for(int i=0; i<ALPHABET_COUNT; i++) {
if(wordDictionary[i] > 0) {
wordDictionary[i] -= 1;
stack.push((char) (i + 'a'));
combination();
stack.pop();
wordDictionary[i] += 1;
}
}
}
}