[ 백준 1759번 ] 암호 만들기

2023. 3. 1. 14:32·Algorithm/문제풀이

1. 문제

 

1759번: 암호 만들기

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

www.acmicpc.net

 

2. 풀이

전형적인 백트래킹 유형의 문제로, 백트래킹(backtracking)을 이용한 순열만들기 유형의 문제라고 보면 된다. 그렇다면 중요한 것은 어떠한 조건을 만족시켜야 하는가를 잘 정의해야 하며, 해당 조건들은 아래와 같다.

 

  • 모음 1개 이상
  • 자음 2개 이상
  • 사전 순으로 출력
  • 길이 C의 문자열 생성

 

사전 순으로 출력해야 하는 조건이 있기 때문에 입력 받은 문자 배열을 오름차순 정렬을 먼저 해주고, 모음 및 자음의 개수는 backtracking 메서드의 매개변수로써 선언해서 사용하였다. 사실 메서드 내부에서 해당 길이를 탐색해주어도 되지만, 제시된 R의 범위가 작을 뿐더러 문자열 내의 모음/자음 개수를 매번 체크하고 싶지 않았기 때문이다.

 

세부 구현은 아래 코드를 참고하자!🚀

 

3. 소스코드

더보기
public class Main {
    static int L, C;
    static char[] arr;
    
    /**
     * @param start 다음 요소 탐색 시작 지점
     * @param len 전체 문자열 길이
     * @param vowel 모음 개수
     * @param consonant 자음 개수
     * @param str 탐색 과정에서 만들고 있는 문자열
     */
    static void backtracking(int start, int len, int vowel, int consonant, String str) {
        if (len == L && vowel >= 1 && consonant >= 2) {
            System.out.println(str);
            return;
        }

        for (int i = start; i < C; i++) {
            if (isVowel(arr[i])) {
                backtracking(i + 1, len + 1, vowel + 1, consonant, str + arr[i]);
            } else {
                backtracking(i + 1, len + 1, vowel, consonant + 1, str + arr[i]);
            }
        }
    }

    static boolean isVowel(char c) {
        return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
    }

    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());

        String[] line = br.readLine().split(" ");
        arr = new char[C];
        for (int i = 0; i < C; i++) {
            arr[i] = line[i].charAt(0);
        }
        Arrays.sort(arr);

        backtracking(0, 0, 0, 0, "");

        br.close();
    }
}
 

GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

Baekjoon Online Judge - explanation of solved problems and complete code - GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > 문제풀이' 카테고리의 다른 글

[ 백준 2003번 ] 수들의 합2  (0) 2023.03.02
[ 백준 14503번 ] 로봇 청소기  (0) 2023.03.01
[ 백준 2642번 ] 전개도  (0) 2023.02.21
[ 백준 20304 ] 비밀번호 제작  (0) 2023.02.18
[ 백준 9742 ] 순열  (0) 2023.02.17
'Algorithm/문제풀이' 카테고리의 다른 글
  • [ 백준 2003번 ] 수들의 합2
  • [ 백준 14503번 ] 로봇 청소기
  • [ 백준 2642번 ] 전개도
  • [ 백준 20304 ] 비밀번호 제작
갈닉
갈닉
중요한 건 엔지니어가 되겠다는 마음. 근데 이제 인문학을 곁들인.
    반응형
  • 갈닉
    KwanIk Devlog
    갈닉
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Algorithm (41)
        • 알고리즘 개요 (8)
        • 문제풀이 (33)
      • Language (2)
        • Java (1)
        • Javascript (0)
        • Go (0)
        • Rust (1)
      • Framework (0)
        • Spring (0)
        • Spring Security (0)
        • Spring JPA (0)
      • Computer Science (1)
        • 프로그래밍 언어 (0)
        • 자료구조 (1)
        • 보안 (0)
      • DevOps (1)
        • MSA (0)
        • TDD (1)
        • DDD (0)
      • 개발서적 (3)
        • 오브젝트 (3)
      • Life (5)
        • 생각생각 (4)
        • 회고록 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • My Github
  • 공지사항

  • 인기 글

  • 태그

    깊이우선탐색
    오브젝트
    boj
    DP
    백트래킹
    Algorithm
    greedy
    알고리즘
    객체지향
    비트마스크
    시뮬레이션
    너비우선탐색
    구현
    bitmask
    java
    욕심쟁이알고리즘
    BFS
    백준
    backtracking
    BruteForce
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
갈닉
[ 백준 1759번 ] 암호 만들기
상단으로

티스토리툴바