[프로그래머스/C++]Lv.1 - 대충 만든 자판

YH J·2023년 5월 1일
0

프로그래머스

목록 보기
78/168

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/160586

내 풀이

targets의 string 하나하나 마다 한글자씩 keymap에서 찾아서 가장 짧은 횟수를 찾아 answer에 넣어준다. 못만드는 단어의 경우 -1을 넣어준다.

내 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    vector<int> answer(targets.size(),0);
    for(int i = 0; i < targets.size(); i++)
    {
        vector<int> num(targets[i].size(),101);
        for(int j = 0; j < targets[i].size(); j++)
        {
            for(int k = 0; k < keymap.size(); k++)
            {
                if(keymap[k].find(targets[i][j]) != string::npos)
                {
                    if(num[j] != -1)
                        num[j] = min(num[j],(int)(keymap[k].find(targets[i][j])));
                    else
                        num[j] = keymap[k].find(targets[i][j]);
                }
                else if(num[j] == 101)
                    num[j] = -1;
            }
        }
        for(const auto& n : num)
        {
            if(n != -1)
                answer[i] += n + 1;
            else
            {
                answer[i] = -1;
                break;
            }
        }
    }
    return answer;
}

다른 사람의 풀이

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    vector<int> answer;

    const int MARKER = 1000000;
    vector<int> table(26,MARKER);
    for(const auto& v : keymap)
    {
        for(int i = 0; i < v.size();++i)
        {
            table[v[i]-'A'] = min(table[v[i]-'A'],i+1);
        }
    }

    for(const auto& str : targets)
    {
        int total = 0;
        for(const auto c : str)
        {
            if(table[c-'A'] == MARKER)
            {
                total = -1;
                break;
            }
            else
            {
                total += table[c-'A'];
            }
        }

        answer.emplace_back(total);
    }

    return answer;
}

다른 사람의 풀이 해석

table이라는 컨테이너에 A,B,C...Z까지 입력할 때 필요한 최소 횟수를 미리 저장해둔다. 그 후 targets의 원소 하나하나의 횟수를 해결해나간다.

profile
게임 개발자 지망생

0개의 댓글