본문 바로가기
문제 풀이/프로그래머스 (Programmers)

[C++] 프로그래머스 : 튜플

by 희조당 2021. 11. 8.
728x90

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

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr


 문제풀이

문제에 대한 이해를 묻는 문제였다.

입력받는 각 string은 튜플에 대한 원소들을 배열한다.

순서가 뒤바뀔 수 있지만 결과적으로 우선순위가 높은(먼저 오는) 숫자는 더 많이 출현한다.

숫자마다 몇 번 출현하는지 확인하고 정렬한 다음에 answer 벡터에 넣어주면 된다.

 느낀 점

처음 코드를 구현할 때 매우 불필요한 부분들이 많았다. 예를 들어 '괄호가 오게 된다면'과 같은 경우에 대해서 모두 따졌다. 하지만 단순하게 숫자의 경우만 따지면 된다. map을 통해서 구현하려고 했는데 그럴 경우 코드가 너무 복잡해지고 정렬하는 경우 map을 vector에 복사하곤 정렬해야 한다는 귀찮은 작업을 요구한다. 더 많은 연습이 필요한 것 같다.

 코드

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

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    int num[100001] = { 0, };

    string tmp = "";
    for (auto ch : s) {
        if (ch - '0' >= 0 && ch - '0' <= 9)
            tmp = tmp + ch;
        else {
            if (tmp.length()) {
                num[stoi(tmp)]++;
                tmp = "";
            }
        }
    }

    vector<pair<int, int>> v; // 나온 횟수, 숫자
    for (int i = 1; i <= 100000;i++) {
        if (num[i])
            v.push_back({ num[i],i });
    }

    sort(v.begin(), v.end());
    reverse(v.begin(), v.end());

    for (auto i : v)
        answer.push_back(i.second);

    return answer;
}

댓글