프로그래머스의 문제 풀이 과정을 공유드린다.
문제 출처

1. 문제설명


  • 자판에 대한 가중치(몇번 눌러야 하는지?)가 주어짐.
  • 알파벳에 해당하는 가중치는 여러번 주어질 수 있음.
  • 그 중 가장 작은 가중치로 설정했을 때 카운팅 결과



2. 알고리즘 설계


  • 알파벳은 26개 이므로 배열[26]을 선언하고 가중치 할당
  • 제한사항을 살펴보면 주어지는 keymap 원소의 길이는 최대 100
  • 따라서 가중치를 미리 101로 설정해두고 101보다 작다면 갱신
  • 알파벳의 가중치가 101이라는 뜻은 없는 알파벳이란 뜻이므로, 이걸 이용해 -1을 위한 예외처리



3. 로직


  • 가중치 할당
    • fill_n은 std namespace에 있는 함수로 (배열, 크기, 원하는 값)을 넣어 사용할 수 있음!
      • 나는 처음에 memset()이란 함수를 사용했는데, 값이 이상해서 검색해보니 0으로만 초기화 가능하다고 함.
    • string은 char의 조합이므로, ‘A’를 빼주면 index로써 사용가능하다.
      • 아스키코드 값인데, ‘A’의 아스키코드 값이 뭐든 간에 ‘A’-‘A’는 0이니까
    • 즉, A에 해당하는 가중치는 arr의 0번째 위치에 갱신
    • (참고) 마지막 라인은 3항 연산자로, if-else 문을 한줄로 쓸 수 있어서 유용하게 사용 중!
    int arr[26] = { 0 };
    
    void allocate(vector<string> keymap) {
        fill_n(arr, 26, 101);
    
        for (int i = 0; i < keymap.size(); i++)
            for (int j = 0; j < keymap[i].size(); j++) {
                int idx = keymap[i][j] - 'A';
                arr[idx] = (arr[idx] <= j) ? arr[idx] : j + 1;
            }
    }
    
  • 카운팅
    • 101이라면 없는 글자라서 값이 갱신이 되지 않은 것을 뜻함.
      • 101로 초기화했고, 최대길이가 100이기 때문에
    • 아니라면 최소값을 계속해서 더해줌.
    if (arr[idx] == 101) {
        answer[i] = -1;
        break;
    }
    else
        answer[i] += arr[idx];
    


  • 전체 코드
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int arr[26] = { 0 };

void allocate(vector<string> keymap) {
    fill_n(arr, 26, 101);

    for (int i = 0; i < keymap.size(); i++)
        for (int j = 0; j < keymap[i].size(); j++) {
            int idx = keymap[i][j] - 'A';
            arr[idx] = (arr[idx] <= j) ? arr[idx] : j + 1;
        }
}

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

    allocate(keymap);

    for (int i = 0; i < targets.size(); i++) {
        answer[i] = 0;
        for (int j = 0; j < targets[i].size(); j++) {
            int idx = targets[i][j] - 'A';
            if (arr[idx] == 101) {
                answer[i] = -1;
                break;
            }
            else
                answer[i] += arr[idx];
        }
    }
    return answer;
}


  • 소감
    • fill_n 함수 매우 유용할듯, 앞으로는 0 초기화도 fill_n으로 사용해서 익숙해져야 할듯함.
    • 문제 조건을 중간에 깨달아서 좀 오래 걸렸는데, 난이도 자체는 레벨 1이 맞는 거 같음.