프로그래머스/lv1/160586. 대충 만든 자판

SITY·2023년 9월 23일
0

Cpp_Algorithm

목록 보기
11/43

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<string> keymap, vector<string> targets) {
    vector<int> answer;
    for (int i = 0; i < targets.size(); i++) {
        string temp = targets[i];
        int sum = 0, sign = 0;
        for (int j = 0; j < temp.size(); j++) {
            vector<int> v;
            int check = 0;
            for (int k = 0; k < keymap.size(); k++) {
                int idx = keymap[k].find(temp[j]);
                if (idx != string::npos)
                    v.push_back(idx + 1);
                else
                    check++;
            }
            if (check != keymap.size())
                sum += *min_element(v.begin(), v.end());
            else {
                sign = 1;
                break;
            }
        }
        if (sum && !sign)
            answer.push_back(sum);
        else
            answer.push_back(-1);
    }
    return answer;
}

targets의 크기만큼 반복, 내부 루프에서는 temp에 targets의 원소를 하나씩 담으면서 temp의 각각의 알파벳을 k루프에서 찾는다. find함수에서 npos가 아니라면 그 인덱스를 Vector에 넣어주고, 만약 찾지 못한다면 check를 한개씩 올려준다.
왜냐하면 모든 keymap에서 찾지 못하면 그 알파벳은 자판에서 사용할 수 없는 것이니 -1를 push하기 위해서다.

그리고 모든 keymap에서 temp[j] 를 검색했다면, k루프에서 빠져나와 check의 수가 keymap의 사이즈와 같으면 그 자판은 사용할 수 없는 것이니 sign을 1로 만들고 break해준 뒤 외부에서 -1를 push하고, 그것이 아니라면 keymap에서 찾은 자판 입력 횟수 중 가장 작은 횟수를 sum에 넣고, 외부에서 최종 값인 sum을 push해준다.

문제를 이해하는 데 시간이 좀 걸렸다. 그리고 min_element에 접근 시 core dumped가 발생해서 check 조건문을 손보느라 애썼다.

profile
·ᴗ·

0개의 댓글