https://www.acmicpc.net/problem/1972
코드설명
해시셋(HashSet) + DFS(깊이우선탐색) 를 활용합니다.
for문과 재귀문 두개 중 하나를 선택해서 할 수 있습니다.
for문을 활용할 경우 특이사항은, 각 0쌍, 1쌍, N-2쌍 의 기준으로 놀라운 문자열인지(유일한지) 판단하니, 밖의 for문으로 감싸고, 각 쌍으로 가능한 모든 경우를 만들기 위해 j = 0; j < N - i; j ++ 반복문을 돌립니다. 이떄 이 반복문의 제약조건이 j < N - i 인 이유는 j + i 가 더해졌을떄 >= N 이면 안되기에, j + i < N을 유지하기 위함입니다.그래야만 연결된 쌍이 IndexOutOfError가 안나겠지요.
for(int i=1; i<=N-2 + 1; i++) { HashSet<String> hashset = new HashSet<>(); for(int j=0; j < N - i; j++) {
코드
for문을 사용한 코드입니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.HashSet; import java.util.StringTokenizer; public class Main { private static int N, M, C, T, K; private static int answer = 0; private static int[] arr; private static long[] cache; private static int Q; private static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; while(true) { StringTokenizer st = new StringTokenizer(br.readLine()); str = st.nextToken(); if(str.equals("*")) break; if(func(str) == true) { System.out.println(str + " is surprising."); }else { System.out.println(str + " is NOT surprising."); } } } private static boolean func(String str) { boolean isAllUnique = true; N = str.length(); for(int i=1; i<=N-2 + 1; i++) { HashSet<String> hashset = new HashSet<>(); for(int j=0; j < N - i; j++) { String newStr= ""; newStr += str.charAt(j); newStr += str.charAt(j + i); if(hashset.contains(newStr) == true) { isAllUnique = false; break; } hashset.add(newStr); } if(isAllUnique == false) return false; } return isAllUnique; } }
재귀문을 사용한 코드입니다.
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.StringTokenizer; public class Main { private static int N, M, C, T; private static int answer = 0; private static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // StringTokenizer st = new StringTokenizer(br.readLine()); while(true){ StringTokenizer st = new StringTokenizer(br.readLine()); String str = st.nextToken(); if(str.equals("*")) break; N = str.length(); boolean isSurprising = true; for(int diff=1;diff<=N-2 + 1; diff++) { HashSet<String> hashset = new HashSet<>(); for(int num = 0; num < N; num++) { if( func(0, num, diff, str, new String(""), hashset) == false) { System.out.println(str + " is NOT surprising."); isSurprising = false; break; } } if(isSurprising == false) break; } if(isSurprising == true) { System.out.println(str+" is surprising."); } } } private static boolean func(int level, int idx, int diff, String originalStr, String str, HashSet<String> hashset) { if(level == 2) { if(hashset.contains(str) == true) { return false; } hashset.add(str); return true; } if(idx >= originalStr.length()) return true; boolean flag2 = func(level + 1, idx + diff, diff, originalStr, str + originalStr.charAt(idx), hashset); return flag2; } }
'알고리즘 > 해시를 사용한 집합과 맵' 카테고리의 다른 글
[백준] 19583 싸이버개강총회 - 해시맵(HashMap) JAVA (0) | 2024.09.11 |
---|---|
[백준] 1270 전쟁 - 땅따먹기 - 해시맵(HashMap) JAVA (0) | 2024.08.13 |
[백준] 22233 가희와 키워드 - HashSet(해시셋) JAVA (0) | 2024.08.12 |
[백준] 9536 여우는 어떻게 울지? - 해시셋(HashSet) JAVA (0) | 2024.07.25 |
[백준] 3273 두 수의 합 - HashSet(해시셋) + 정렬(Sort) + 투포인터(Two Pointer) JAVA (0) | 2024.07.23 |