상세 컨텐츠

본문 제목

[백준][C++]17269 이름궁합 테스트

Log.Develop/PS

by bluayer 2020. 2. 22. 14:07

본문

문제의 난이도

Bronze 1

문제 분석

문제의 난이도가 Bronze인 만큼, 문제가 그렇게 어렵지 않다.

문제의 핵심은 아주 아주 간단하다.

  1. 알파벳의 획수를 어떻게 저장할 것인가?

  2. 수행을 어떤 방식으로 할 것인가?

문제 해결

1. 알파벳의 획수를 어떻게 저장할 것인가?

사실 배열로 저장해도 되지만, 배열로 찾는 거보다 map을 활용해서 저장하는 것이 더 좋다고 생각했다.

일단 알파벳 : 획수와 같은 key, value 형식이 가장 먼저 생각났다는 점,

실제로 프로그래밍하기 쉽고 직관적이라는 점에서 map을 선택하게 되었다.

2. 수행을 어떤 방식으로 할 것인가?

사실 이 문제는 수행의 횟수가 명확하게 정해져 있다.

두 이름의 길이인 N, M을 바탕으로 N + M -2가 되는데, 마지막에 2개만 남겨야 하기 때문이다.

따라서 이 수행 횟수만큼 진행하되,

배열을 하나만 쓰는 경우 마지막 요소에 대해서만 잘 해결해주면 문제가 아주 깔끔하게 해결된다.

 

해답 코드

최대한 본인의 힘으로 풀어보시고 확인하시는 걸 추천합니다!

더보기
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

map<char, int> m;
vector<int> con;

// 알파벳 : 획수 형태의 map을 만든다.
void init() {
    m.insert(make_pair('A', 3));
    m.insert(make_pair('B', 2));
    m.insert(make_pair('C', 1));
    m.insert(make_pair('D', 2));
    m.insert(make_pair('E', 4));
    m.insert(make_pair('F', 3));
    m.insert(make_pair('G', 1));
    m.insert(make_pair('H', 3));
    m.insert(make_pair('I', 1));
    m.insert(make_pair('J', 1));
    m.insert(make_pair('K', 3));
    m.insert(make_pair('L', 1));
    m.insert(make_pair('M', 3));
    m.insert(make_pair('N', 2));
    m.insert(make_pair('O', 1));
    m.insert(make_pair('P', 2));
    m.insert(make_pair('Q', 2));
    m.insert(make_pair('R', 2));
    m.insert(make_pair('S', 1));
    m.insert(make_pair('T', 2));
    m.insert(make_pair('U', 1));
    m.insert(make_pair('V', 1));
    m.insert(make_pair('W', 1));
    m.insert(make_pair('X', 2));
    m.insert(make_pair('Y', 2));
    m.insert(make_pair('Z', 1));
}

int main() {
    init();
    int N, M;
    string A, B;
    cin >> N >> M;
    cin >> A >> B;

    // 초기 상태를 만든다.
    // 다만, 남은 글자가 있을 수 있으므로 이를 체크한다.
    for(int i =0; i< max(N, M); i++) {
        if(N > i) {
            con.push_back(m[A.at(i)]);
        }

        if(M > i) {
            con.push_back(m[B.at(i)]);
        }
    }

    // 정해진 횟수 : N + M -2
    for (int i = 0; i < N + M - 2; i++) {
        for (int j=0; j<con.size(); j++) {
            // 마지막 경우만 유의해준다.
            if (j == con.size() -1) {
                con.pop_back();
                break;
            }
            // 더하는 과정
            con[j] = (con[j] + con[j + 1]) % 10;
        }
    }
    
    // 출력 과정에서 십의 자리가 0일 경우를 체크한다.
    if (con[0] == 0) {
        cout << con[1];
    } else {
        cout << con[0] << con[1];
    }
    cout << '%';

    return 0;
}

관련글 더보기

댓글 영역