dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • HackerRank mysql
  • 백준 DP
  • c++
  • 네이버 부스트캠프
  • 서블릿
  • 프로그래머스
  • 기록
  • 프로그래머스 SQL
  • 일기
  • BFS
  • Hackerrank
  • 반성
  • 스프링
  • 회고
  • Baekjoon
  • 부스트캠프
  • 백준
  • AI Tech
  • 그래프탐색
  • dp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/프로그래머스 알고리즘, SQL

[프로그래머스 LV2] 튜플 (문자열) / 2019 카카오 개발자 겨울 인턴십) [C++]

2021. 7. 2. 18:27
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

 

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

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

--------------------------------------------------------

이 조건을 잘 이해해야 한다. 튜플은 1, 2, 3과 2, 1, 3이 다르므로 최종 결과 튜플의 순서를 잘 정하는 것이 중요하다.

튜플 a, b, c, d를 표현하려면 {a}, {b, a}, {c, a, b}, {d, a, b, c}도 된다는 것이다.

(집합의 원소의 순서는 바뀌어도 된다. 그 대신 집합 사이즈 1은 무조건 튜플의 첫 번째 원소여야 하고, 집합 사이즈 2는 무조건 튜플의 첫 번째 원소와 두 번째 원소로 이루어져야 한다)

 

따라서 집합 사이즈 1의 원소가 튜플의 첫 번째 원소가 되고, 사이즈 2의 원소들 중 1에서 찾은 원소를 뺀 나머지 원소가 두 번째 원소이므로 순서대로 집합 안에서 찾아야 한다.

 

1. 매 집합에서 찾은 튜플의 원소를 삭제하는 방법 +문자열 연습 버전

 - {a}, {b, a}, {c, a, b}, {d, a, b, c}에서 a를 찾으면 나머지 집합에서 a를 삭제

 - 0, {b}, {c, b}, {d, b, c}에서 그다음 b를 찾고 b를 삭제

이런 식으로 찾으면 튜플의 순서대로 구할 수 있다.

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

using namespace std;

bool compare(vector<string>& s1, vector<string>& s2) {
    return s1.size() < s2.size();
}

vector<int> solution(string s) {
    vector<int> answer;
    vector<vector<string>> list;
    s.erase(s.size() - 1, s.size());
    istringstream ss(s);
    string buffer = "";
    while (getline(ss, buffer, '}')) {
        vector<string> temp;
        string tempString = "";
        string subBuffer = buffer.substr(2);
        for (int i = 0; i < subBuffer.size(); i++) {
            if (isdigit(subBuffer[i])) {
                tempString += subBuffer[i];
            }
            else if (subBuffer[i] == ',') {
                temp.push_back(tempString);
                tempString = "";
            }
        }
        if (tempString.size())
            temp.push_back(tempString);
        list.push_back(temp);
    }

    sort(list.begin(), list.end(), compare);

    for (int i = 0; i < list.size(); i++) {
        answer.push_back(stoi(list[i][0]));
        for (int j = i + 1; j < list.size(); j++) {
            auto it = find(list[j].begin(), list[j].end(), list[i][0]);
            int index = it - list[j].begin();
            list[j].erase(list[j].begin() + index);
        }
    }

    return answer;
}

 

2. 집합 안의 숫자의 개수를 세서 튜플을 구성하는 방법

- 따지고 보면 제일 첫 번째 원소는 모든 집합에 포함되어 있고, 두 번째 원소는 두 번째 집합부터 끝까지 포함되어 있다.

따라서 나온 숫자의 개수를 세줘서 내림차순을 하면 그것이 바로 튜플의 순서이다.

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>

using namespace std;

unordered_map<string, int> m;

vector<int> solution(string s) {
    vector<int> answer;
    string temp = "";
    for(auto c : s){
        if(c-'0' >= 0 && c-'0' <= 9){
            temp += c;
        }
        else{
            if(temp.size()){
                m[temp]++;
                temp.clear();
            }
        }
    }
    
    vector<pair<int, int>> v;
    
    for(auto it : m){
        v.push_back(make_pair(it.second, stoi(it.first)));    
    }
    sort(v.begin(), v.end());
    reverse(v.begin(), v.end());
    for(int i = 0 ; i < v.size() ; i++){
        answer.push_back(v[i].second);
    }
    
    return answer;
}

map에 개수를 저장해주고, vector에 담아서 개수로 내림차순 정렬을 해주고 순서대로 튜플에 넣어준다.

 

최근 코테를 보면서 자주 나왔던 문자열 + 알고리즘 문제인 것 같다.

728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 프로그래머스 알고리즘, SQL' 카테고리의 다른 글

[프로그래머스 LV3] 단어 변환 (BFS, DFS) [C++, JAVA]  (0) 2021.08.12
[프로그래머스 LV2] 최댓값과 최솟값 (문자열) [C++]  (0) 2021.07.04
[프로그래머스 LV2] 카카오프렌즈 컬러링북 (BFS, DFS) / 2017 카카오 코드 예선) [C++]  (0) 2021.07.02
[프로그래머스 LV2] 단체사진 찍기 (조합) / 2017 카카오 코드 본선) [C++]  (0) 2021.07.01
[프로그래머스 LV1] 비밀 지도 (이진수, 비트연산, 문자열) / 2018 KAKAO BLIND RECRUITMENT) [C++]  (0) 2021.06.04
    '문제 풀이/프로그래머스 알고리즘, SQL' 카테고리의 다른 글
    • [프로그래머스 LV3] 단어 변환 (BFS, DFS) [C++, JAVA]
    • [프로그래머스 LV2] 최댓값과 최솟값 (문자열) [C++]
    • [프로그래머스 LV2] 카카오프렌즈 컬러링북 (BFS, DFS) / 2017 카카오 코드 예선) [C++]
    • [프로그래머스 LV2] 단체사진 찍기 (조합) / 2017 카카오 코드 본선) [C++]
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바