[BOJ] 1759: 암호 만들기 (JAVA)

2024. 9. 23. 22:55·Algorithm/완전탐색

문제

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

 

풀이

문제에서 주어지는 조건은 다음과 같다.

  • 주어지는 알파벳의 개수가 최대 15개 ⇒ 완전탐색?
  • 주어지는 L개의 알파벳 중에 C개의 알파벳을 중복없이 고르기 ⇒ 순열? 조합?
  • 암호를 이루는 알파벳을 증가하는 순서대로 배열하기 ⇒ 입력받은 알파벳을 정렬하기
  • 암호는 최소 1개의 모음, 최소 2개의 자음으로 구성하기 ⇒ 가능성이 있는 암호인지 확인하기 위해 모음의 개수와 자음의 개수 세기

a b c는 암호가 될 수 있지만 b a c는 암호가 될 수 없다. 이는 순서가 있는 것처럼 보여, 순열로 풀어야 한다고 생각할 수 있다. 하지만 알파벳이 정렬된 상태에서 고르는 것이므로, 현재 알파벳의 앞부분을 확인하지 않는다. 따라서 조합을 사용하면 된다.

 

 

또한 암호를 이루는 알파벳을 선택할 때, 가능성이 있는 암호인지 확인하기 위해 모음의 개수와 자음의 개수를 세야 한다. 길이가 C인 암호를 만들었을 때, 모음이 1개 이상이고 자음이 2개 이상이면 해당 암호를 출력하면 된다.

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ_1759 {

	static int L, C;
	static char[] chars, result;
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		L = Integer.parseInt(st.nextToken()); // 암호 길이
		C = Integer.parseInt(st.nextToken()); // 가능한 알파벳 개수
		chars = new char[C]; // 알파벳 저장용
		result = new char[L]; // 암호 저장용
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < C; i++) {
			chars[i] = st.nextToken().charAt(0);
		}
		// 알파벳 정렬
		Arrays.sort(chars);
		dfs(0, 0, 0, 0);
		System.out.println(sb);
	}

	// C개 중에 L개 뽑기 (조합)
	static void dfs(int depth, int start, int a, int b) { // a: 모음의 수, b: 자음의 수
		if (depth == L) {
			// 암호는 최소 1개의 모음, 최소 2개의 자음으로 구성됨
			if (a >= 1 && b >= 2) {
				for (char c : result) {
					sb.append(c);
				}
				sb.append("\n");
			}
			return;
		}

		for (int i = start; i < C; i++) {
			result[depth] = chars[i];
			if (checkChar(chars[i]))
				dfs(depth + 1, i + 1, a + 1, b);
			else
				dfs(depth + 1, i + 1, a, b + 1);
		}
	}

	static boolean checkChar(char c) {
		if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
			return true;
		return false;
	}
}

 

후기

처음에 암호의 조건이 최소 1개의 모음, 최소 2개의 자음을 사용해야 한다는 것을 흘려봤다.. 그리고 암호를 저장하는 배열의 길이를 잘못 초기화했다ㅎ..

 

이런 쓸데없는 실수들이 반복되지 않도록 꼼꼼히 문제를 풀도록 하자.


 

'Algorithm > 완전탐색' 카테고리의 다른 글

[BOJ] 18111: 마인크래프트 (JAVA)  (0) 2024.12.16
[BOJ] 14889: 스타트와 링크 (JAVA)  (0) 2024.09.22
[BOJ] 14500: 테트로미노 (JAVA)  (1) 2024.09.16
[SWEA] 4193: 수영대회 결승전 (JAVA)  (0) 2024.07.04
[BOJ] 2961: 도영이가 만든 맛있는 음식 (JAVA)  (0) 2024.05.21
'Algorithm/완전탐색' 카테고리의 다른 글
  • [BOJ] 18111: 마인크래프트 (JAVA)
  • [BOJ] 14889: 스타트와 링크 (JAVA)
  • [BOJ] 14500: 테트로미노 (JAVA)
  • [SWEA] 4193: 수영대회 결승전 (JAVA)
hjin28
hjin28
  • hjin28
    끄적이는 기록장
    hjin28
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • GitHub
    • 이전 블로그
    • 분류 전체보기
      • TIL
      • Frontend
      • Backend
      • Infra
      • Java
        • 이것이 자바다
      • CS
        • 컴퓨터구조
        • 운영체제
        • 네트워크
        • 데이터베이스
      • Algorithm
        • 자료구조
        • 시뮬레이션
        • 완전탐색
        • BFS & DFS
        • DP
        • 그리디
        • 최단경로
        • 유니온파인드
        • 위상정렬
        • 정렬
        • SQL
      • ETC
  • 최근 글

  • 태그

    java
    Spring
    SQL
    websocket
    최단경로
    컴퓨터구조
    til
    유니온파인드
    덱
    ec2
    위상정렬
    vue
    자바
    완전탐색
    JWT
    DP
    BFS
    springsecurity
    자료구조
    백트래킹
    구현
    그리디
    Programmers
    백준
    비트마스킹
    투포인터
    다이나믹프로그래밍
    SWEA
    DFS
    CS
  • hELLO· Designed By정상우.v4.10.1
hjin28
[BOJ] 1759: 암호 만들기 (JAVA)
상단으로

티스토리툴바