본문 바로가기

Algorithm/DFS

(C++) - 프로그래머스(위클리 챌린지) : 5주차

반응형

https://programmers.co.kr/learn/courses/30/lessons/84512

 

코딩테스트 연습 - 5주차

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니

programmers.co.kr

조합 + 정렬문제였습니다.

 

📕 풀이방법

📔 입력 및 초기화

나올 수 있는 모든 형태의 문자열을 저장하기 위한 vector변수 dictionary를 선언합니다.

 

📔 풀이과정

 1. 나올 수 있는 모든 문자열을 dictionary에 push해줍니다.

 2. 자리마다 확인하며 사전상 앞에 오는 문자 순으로, 자리수에 대한 오름차순으로 정렬해줍니다.

 3. dictionary를 순회하며 단어를 찾았다면 해당 index + 1을 반환합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
vector <string> dictionary;
string allChar = "AEIOU";
map <string,int> m;
bool cmp(string a, string b){
    for(int i = 0; i < a.size(); i++)
        if(a[i] < b[i] && i < b.size()) 
            return a[i] < b[i];
    return (int)a.size() < (int)b.size();
}

void dfs(int depth, string word, int limit){
    if(depth == limit){
        m[word] = 1;
        return;
    }
    for(int i = 0; i < 5; i++) dfs(depth + 1, word + allChar[i], limit);
}

int solution(string word) {
    int answer = 1;
    dictionary.clear();
    m.clear();
    for(int i = 1; i <= 5; i++)
        dfs(0,"",i);

    for(auto el : m) dictionary.push_back(el.first);

    for(auto d : dictionary) {
        if(d == word) return answer;
        answer++;
    }
}