-
[Java] 1759번 : 암호 만들기BOJ 2024. 1. 24. 23:05
https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
처음에 메모리초과 나와서 꽤나 당황했다,,,
처음에는 combination 이 아니라 순열을 돌렸기 땜시,,,여기에서 오류가 팡팡팡팡 파라팡~ 나왔다,,,ㅎ
public static void permutation(String arr[], boolean visited[], String output[], int depth, int r) { if(depth==r) { String str =""; for(int i=0;i<r;i++) { str+=(output[i]+ ""); } boolean flag=false; for(int i=0;i<str.length()-1;i++) { if(str.charAt(i) > str.charAt(i+1)) { flag=true; } } if(!flag) { sb.append(str).append("\n"); } return; } for(int i=0;i<arr.length;i++) { if(!visited[i]) { visited[i] = true; output[depth] = arr[i]; permutation(arr, visited, output, depth+1, r); visited[i] = false; } } }
두번째 틀린이유는 바로 이 부분이다!
for(int i=0;i<str.length()-1;i++) { if (str.charAt(i) > str.charAt(i + 1)) { flag=true; } if(str.charAt(i)=='a' || str.charAt(i)=='e' || str.charAt(i)=='i' || str.charAt(i)=='o' || str.charAt(i)=='u') { cnt1++; }else { cnt2++; } } if(!flag) { if(cnt1>=1 && cnt2>=2) { sb.append(str).append("\n"); } }
str.length()-1 까지만 비교해놔서 마지막 자음, 모음 갯수가 세어지지 않아서였당,,!
함수를 아래처럼 바꿔주고 통과!!!
public static void combination(String arr[], boolean visited[], int start, int depth) { if(depth==n) { String str=""; for(int i=0;i<arr.length;i++) { if(visited[i]) { str+=arr[i]; } } boolean flag=false; // 순서 판단 int cnt1=0, cnt2=0; // cnt1 : 모음, cnt2 : 자음 // 만약 순서대로가 아니라면 flag 를 바꿔주고 break 해서 나온다! for(int i=0;i<str.length()-1;i++) { if (str.charAt(i) > str.charAt(i + 1)) { flag=true; break; } } // 모음, 자음 갯수 세기 for(int i=0;i<str.length();i++) { if(str.charAt(i)=='a' || str.charAt(i)=='e' || str.charAt(i)=='i' || str.charAt(i)=='o' || str.charAt(i)=='u') { cnt1++; }else { cnt2++; } } // flag에 변동이 없다면 순서대로니까, 자음, 모음, 갯수가 맞다면 출력 if(!flag) { if(cnt1>=1 && cnt2>=2) { sb.append(str).append("\n"); } } return; } for(int i=start;i<arr.length;i++) { if(!visited[i]) { visited[i] = true; combination(arr, visited, i+1, depth+1); visited[i] = false; } } }
[전체코드]
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { static int n, m; static String[] cArr; static boolean[] visited; static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); cArr = new String[m]; visited = new boolean[m]; st = new StringTokenizer(br.readLine()); for(int i=0;i<m;i++) { cArr[i] = st.nextToken(); } Arrays.sort(cArr); // 사전 순으로 정렬 combination(cArr, visited, 0, 0); System.out.print(sb); } public static void combination(String arr[], boolean visited[], int start, int depth) { if(depth==n) { String str=""; for(int i=0;i<arr.length;i++) { if(visited[i]) { str+=arr[i]; } } boolean flag=false; // 순서 판단 int cnt1=0, cnt2=0; // cnt1 : 모음, cnt2 : 자음 for(int i=0;i<str.length()-1;i++) { if (str.charAt(i) > str.charAt(i + 1)) { flag=true; break; } } for(int i=0;i<str.length();i++) { if(str.charAt(i)=='a' || str.charAt(i)=='e' || str.charAt(i)=='i' || str.charAt(i)=='o' || str.charAt(i)=='u') { cnt1++; }else { cnt2++; } } if(!flag) { if(cnt1>=1 && cnt2>=2) { sb.append(str).append("\n"); } } return; } for(int i=start;i<arr.length;i++) { if(!visited[i]) { visited[i] = true; combination(arr, visited, i+1, depth+1); visited[i] = false; } } } }
'BOJ' 카테고리의 다른 글
[Java] 15661번 : 링크와 스타트 (1) 2024.01.27 [Java] 1421번 : 나무꾼 이다솜 (1) 2024.01.26 [Java] 15663번 : N과 M (9) (2) 2024.01.24 [Java] 15651번 : N과 M (3) (0) 2024.01.22 [Java] 28278번 : 스택2 (2) 2024.01.19