Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • Network
  • DFS
  • docker
  • boj
  • 다이나믹 프로그래밍
  • django
  • 프로그래머스
  • BFS
  • Kubernetes
  • 백트래킹

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Algorithm/프로그래머스

[프로그래머스] level2 튜플 (C++)

2022. 1. 18. 04:20

2019 카카오 겨울 인턴십

 

 

배열이 주어지고, 튜플을 만드는 방법을 문제에서 친절히 알려줬다.

원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.
{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는
{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

 

 

문제에서 원하는 답은 튜플을 분석해서 원래의 배열을 구하라는 것이다.

문제는 튜플이 문자열로 주어진다는 것이다..

나는 C++로 풀어서 파싱하는 과정이 조금 귀찮았지만, 파이썬으로 풀면 전체 코드가 9-10줄 정도면 충분하다고 한다.

 

 

튜플 문자열 파싱

int number = 0;
    for(int i = 0; i < s.size(); i++){
        if(s[i] == '{') continue;
        if(s[i] == '}' || s[i] == ','){
            num[number]++;
            number = 0;
            continue;
        }
        if(isdigit(s[i])){
            number = number * 10 + (s[i] - '0');
        }
    }

'{'는 넘어간다.

'}'이거나 ','인 경우에는 숫자가 끝났다는 의미이므로 지금까지 만든 숫자를 가지고 해당 숫자가 나온 횟수를 1 증가시킨다.

만약 현재 문자가 숫자로 변환 가능하다면 number = number*10 + (숫자) 식을 이용해서 숫자를 저장해둔다.

 

 

숫자의 최대 크기가 10만이다. 따라서 10만의 배열에 각 숫자가 몇 번 나왔는지 저장가능하다.

위 파싱 과정에서 저장이 완료되고

만들어진 배열을 돌면서 숫자가 나왔다면, 해당 숫자와 그 숫자가 몇 번 나왔는지를 pair로 묶어서 다른 벡터에 넣어준다.

 

튜플을 만드는 배열의 숫자는 왼쪽으로 갈 수록(인덱스가 0으로 갈수록) 숫자가 등장하는 횟수가 증가한다.

따라서 알맞게 정렬을 해준다면 답을 구할 수 있다.

 

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

using namespace std;

int num[100001];

vector<int> solution(string s) {
    vector<pair<int, int> > vec;
    vector<int> answer;
    
    int number = 0;
    for(int i = 0; i < s.size(); i++){
        if(s[i] == '{') continue;
        if(s[i] == '}' || s[i] == ','){
            num[number]++;
            number = 0;
            continue;
        }
        if(isdigit(s[i])){
            number = number * 10 + (s[i] - '0');
        }
    }
    
    for(int i = 1; i < 100001; i++){
        if(!num[i]) continue;
        vec.push_back({num[i], i});
    }
    
    sort(vec.begin(), vec.end());
    reverse(vec.begin(), vec.end());
    
    for(auto w: vec){
        answer.push_back(w.second);
    }
    
    return answer;
}

 

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스] level2 단체사진 찍기 (C++)  (0) 2022.01.18
[프로그래머스] level2 빛의 경로 사이클 (C++)  (0) 2022.01.18
[프로그래머스] level2 행렬 테두리 회전하기 (C++)  (0) 2022.01.16
[프로그래머스] level2 메뉴 리뉴얼 (C++)  (0) 2022.01.16
[프로그래머스] level2 수식 최대화 (C++)  (0) 2022.01.14
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스] level2 단체사진 찍기 (C++)
    • [프로그래머스] level2 빛의 경로 사이클 (C++)
    • [프로그래머스] level2 행렬 테두리 회전하기 (C++)
    • [프로그래머스] level2 메뉴 리뉴얼 (C++)

    티스토리툴바