코테/백준

[백준/JAVA] 1759번: 암호 만들기

imname1am 2023. 8. 22. 02:27
반응형

🔺 문제

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

 

 

🔺 코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.*;
import java.io.*;
 
public class Main {
    static int L, C;
    static String[] inputArr;   // 전체 문자가 저장된 배열
    static String[] strArr;     // 뽑은 문자들을 저장할 배열
    
    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(), " ");
        
        L = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        
        inputArr = new String[C];
        strArr = new String[L];
        
        st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0 ; i < C ; i++) {
            inputArr[i] = st.nextToken();
        }
        Arrays.sort(inputArr); // 오름차순 정렬
        
        combination(0000);
        System.out.println(sb);
    }
    
    // start : 탐색 시작 인덱스 위치
    // cnt : 카운트 직전까지 뽑은 조합에 포함된 수 갯수
    private static void combination(int start, int cnt, int mo, int za) {
        // [메소드 종료 조건]
        if(cnt == L) {
            // 최소 1개의 모음 (aeiou) & 최소 2개의 자음
            if(mo >= 1 && za >= 2) {
                for(int i = 0 ; i < strArr.length ; i++) {
                    sb.append(strArr[i]);
                }
                sb.append("\n");
            }
            
            return;
        }
        
        // 브루트포스 (inputArr 배열의 모든 수 시도)
        // start부터 처리하면 중복 수 추출 방지 & 순서가 다른 조합 추출 방지
        for(int i = start ; i < C ; i++) {
            if(inputArr[i].equals("a"|| inputArr[i].equals("e"|| inputArr[i].equals("i"|| inputArr[i].equals("o"|| inputArr[i].equals("u")) {
                strArr[cnt] = inputArr[i];
                combination(i + 1, cnt + 1, mo + 1, za);    // 다음 숫자 뽑으러 가기
            }
            else {
                strArr[cnt] = inputArr[i];
                combination(i + 1, cnt + 1, mo, za + 1);    // 다음 숫자 뽑으러 가기
            }
        }
    }
}
 
cs
✅ 해결 아이디어
✔ 백트래킹 활용한 조합 구현 + 브루트포스

 


🔺 다른 풀이들

- 암호가 될 수 있는 문자들 입력을 char형으로 받으셨고,

  암호 조합을 만들 때 String ""에 +로 붙이는 식으로 만드는 식으로 하셨다.

 

로그인

 

www.acmicpc.net

 

 

-  내 코드랑 해당 문자가 모음인지 자음인지 확인해서 갯수 세는 타이밍이 좀 다르다. (대부분 이 순서로 푸셨다.)

 

[JAVA]백준 1759번: 암호 만들기

https://www.acmicpc.net/problem/1759 1759번: 암호 만들기 첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자

kwoncorin.tistory.com

코드 확인하기
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.io.*;
import java.util.*;
 
public class Main {
 
    public static int L, C;
    public static char[] list, code;
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
 
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        L = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
 
        list = new char[C];
        code = new char[L];
 
        st = new StringTokenizer(br.readLine());
        for (int x = 0; x < C; x++) {
            list[x] = st.nextToken().charAt(0);
        }
 
        Arrays.sort(list);
        makeCode(0, 0);
 
    }
 
    public static void makeCode(int start, int idx) {
        if (idx == L) {
            // 최소 1개의 모음, 최소 2개의 자음인지 확인
            if (isValid()) {
                System.out.println(code);
            }
            return;
        }
        
        for (int i = start ; i < C ; i++) {
            code[idx] = list[i];
            makeCode(i + 1, idx + 1);
        }
    }
 
    // 최소 모음 1개, 최소 자음 2개인지 확인
    public static boolean isValid() {
        int mo = 0;
        int ja = 0;
 
        for (char x : code) {
            if (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u') {
                mo++;
            } else {
                ja++;
            }
        }
 
        if (mo >= 1 && ja >= 2) {
            return true;
        }
        return false;
    }
 
}
cs

 

 

- visited 배열을 사용하셨다.

 

[자바] 백준 : 1759 암호만들기 (브루트포스 + 백트래킹 조합) 풀이 및 문제 접근법 / 유사 문제

[자바] 백준 : 1759 암호만들기 (브루트포스 + 백트래킹 조합) 풀이 및 문제 접근법 / 유사 문제 https://w...

blog.naver.com


💬 느낀 점

이번주 조합 문제를 많이 풀어보고

내것으로 만들어보겠다......💪💪💪💪

 

복습도 많이 해보겠다....

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 백트래킹 활용한 조합 구현 방법 참고

 

[알고리즘] 순열, 중복 순열, 조합, 중복 조합 - 자바

1. 순열(Permutation) 서로 다른 것들 중 몇 개를 뽑아서 한 줄로 나열하는 것 서로 다른 n개 중 r개를 택하는 순열은 아래와 같이 표현할 수 있다. 수식으로 나타내면 다음과 같다. 위 식을 간략화 하

whitehairhan.tistory.com

 

반응형