Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_6443] 애너그램 본문

Study/Problem Solving

[BOJ_6443] 애너그램

monitor 2023. 10. 14. 13:33

설명


중복 제거를 줄이기 위해 처음에는 그냥 알파벳의 index 위치로 탐색했다가 메모리 초과가 나서 다시 생각해서 풀어보았다. 아래와 같이 알파벳의 갯수에 대해서 카운트 하면 a -> a -> b 와 같은 것이 한 번 더 나올 수가 없다.

 

뒤로 돌아갔을때 만일 index 위치로 탐색하면 처음 나온 a와 뒤에 나온 a 값이 다른 것인데 알파벳의 count 값으로 방문 선정을 해버리면 처음에 나온 a와 뒤에 나온 a는 모두 같은 경우이다. (for문 내부에서 넘어가는 i 값이 달라져 버리니... 다음번에 선택을 할 수 밖에 없다.)

 

 

 

코드


package backtracking;

import java.util.*;
import java.io.*;

public class BOJ_6443 {
    static char[] crr;
    static int[] visited;
    static StringBuilder sb;
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");
        int N = Integer.parseInt(tk.nextToken());
        sb = new StringBuilder();
        for(int i = 0; i < N; i++){
            tk = new StringTokenizer(in.readLine()," ");
            String str = tk.nextToken();
            crr = str.toCharArray();
            visited = new int[26];
            for(char now : crr){
                visited[now - 'a']++;
            }
            go(0,"");
        }
        System.out.println(sb.toString());
    }

    private static void go(int idx,String str) {
        if(idx == crr.length){
            sb.append(str + "\n");
            return;
        }
        for(int i = 0; i < 26; i++){
            if(visited[i] > 0){
                visited[i]--;
                go(idx + 1, str + (char) ('a'+ i));
                visited[i]++;
            }
        }
    }
}

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_2661] 좋은 수열  (0) 2023.10.15
[BOJ_18430] 무기 공학  (0) 2023.10.15
[BOJ_3980] 선발 명단  (0) 2023.10.12
[BOJ_1174] 줄어드는 수  (1) 2023.10.11
[BOJ_14712] 넴모넴모 (Easy)  (0) 2023.10.10