[백준] 1759. 암호 만들기 - Java

2025. 6. 11. 19:02·백준 알고리즘/Java

https://www.acmicpc.net/problem/1759

 

⭐️ 중요 포인트

1. 기본적인 백트리킹과 동일하나 자음과 모음의 개수를 카운트할 수 있는 메서드가 필요하다. (처음에는 모음의 개수만 세고 자음은 최소 두 개라는 조건을 만족하지 않아 틀렸었다.)

2. 중복되는 것은 없으며 오름차순으로 정렬된 결과값을 출력해야하기 때문에 사용할 수 있는 알파벳을 오름차순 정렬시켜 초기값을 세팅한다.

3. 현재 코드에서 처음에 ArrayList.contains()를 통해 모음이 최소 한 개를 만족하는지 판단했었는데. 모음의 개수가 5개이고, N이 크다면 모음이 존재하는지 판단하는 메서드의 시간복잡도는 O(5N)이 된다. 현재 코드는 contains()가 빠지고 O(N)으로 리스트 전체를 순회하며 카운트하기 때문에 필요없지만, 만약 이후에 contians()가 반복적으로 필요한 문제가 나올 경우에는 HashMap을 통해 값을 저장하고 해당 값이 있는지 확인하려면 HashMap.contains()를 사용하면 O(1)에 확인이 가능하다.

 

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

public class P1759 {

    static BufferedReader br;
    static BufferedWriter bw;

    static int L;
    static int C;
    static List<Character> alphabets;
    static List<Character> selected;


    static void init() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());

        L = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        alphabets = new ArrayList<>();
        selected = new ArrayList<>();

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < C; i++) {
            alphabets.add(st.nextToken().charAt(0));
        }

        Collections.sort(alphabets);
    }

    static void solve() throws IOException {

        recursion(0);


    }

    static void recursion(int idx) throws IOException {
        if (selected.size() == L) {
            int vowelCount = countVowel();
            int consonantCount = selected.size() - vowelCount;
            if (vowelCount >= 1 && consonantCount >= 2) {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < selected.size(); i++) {
                    sb.append(selected.get(i));
                }
                bw.write(sb.toString());
                bw.newLine();
            }
            return;
        }

        for (int i = idx; i < alphabets.size(); i++) {
            selected.add(alphabets.get(i));
            recursion(i + 1);
            selected.remove(selected.size() - 1);
        }

    }

    static int countVowel() throws IOException {
        int ret = 0;
        for (int i = 0; i < selected.size(); i++) {
            if (selected.get(i) == 'a' || selected.get(i) == 'e' || selected.get(i) == 'i' || selected.get(i) == 'o' || selected.get(i) == 'u') {
                ret++;
            }
        }

        return ret;
    }

    public static void main(String[] args) throws IOException {
        init();
        solve();

        bw.flush();
        bw.close();
        br.close();
    }

}

'백준 알고리즘 > Java' 카테고리의 다른 글

[백준] 2580. 스도쿠 - Java  (1) 2025.06.12
[백준] 1987. 알파벳 - Java  (0) 2025.06.11
[백준] 15654. N과 M (5) - Java  (0) 2025.06.11
[백준] 1780. 종이의 개수 - Java  (1) 2025.06.11
[백준] 6603. 로또 - Java  (1) 2025.05.30
'백준 알고리즘/Java' 카테고리의 다른 글
  • [백준] 2580. 스도쿠 - Java
  • [백준] 1987. 알파벳 - Java
  • [백준] 15654. N과 M (5) - Java
  • [백준] 1780. 종이의 개수 - Java
리버🐦‍🔥
리버🐦‍🔥
개발새발 개발일기
  • 리버🐦‍🔥
    개발도 개발새발
    리버🐦‍🔥
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • Python
        • Java
      • 프로그래머스 알고리즘
        • Python
        • Swift
        • Java
      • 코드트리 알고리즘
        • Python
      • Spring boot
        • 스프링 부트 3 백엔드 개발자 되기(자바편)
      • SwiftUI
      • UIKit
      • Programming Language
        • Swift
        • Java
      • 공부해야될 것
        • iOS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스프링 부트 3 백앤드 개발자 되기 : 자바편
    Java
    백준
    Swift
    uikit
    스프링 부트
    큐
    UITextView
    그리디 알고리즘
    스프링 부트 3 백엔드 개발자 되기 : 자바편
    백앤드 개발자
    스프링 부트 3
    Baekjoon
    프로그래머스
    파이썬
    애너테이션
    너비 우선 탐색
    ci/cd
    문자열
    Code-based
    programmers
    ios
    데이터베이스
    깊이 우선 탐색
    스위프트
    그래프
    구현
    코드베이스
    자바
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
리버🐦‍🔥
[백준] 1759. 암호 만들기 - Java
상단으로

티스토리툴바