programmers 튜플 : programmers.co.kr/learn/courses/30/lessons/64065#qna

 

코딩테스트 연습 - 튜플

"{{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

 

2019 카카오 개발자 겨울 인턴십에 출제된 튜플 문제입니다.

 

솔직히 문제를 어떻게 푸는건지 이해가 되지 않아서,, 접근 방법을 따로 검색해보았습니다.

주어진 문자열 내부의 집합을 원소의 갯수 기준으로 정렬한 후에,

각 집합의 원소에 접근하여 처음 나온 원소이면 기존 튜플의 순서가 되는 것입니다.

 

문제가 이해가 안되서 좀 당황스러운데,.. 왠지 이런 문제가 나오면 못풀것만 같은 느낌..

 

접근방법을 알고 코드만 작성해보았습니다.

파이썬같은 스플릿이나 문자열 처리하는 방법을 따로 공부하지 않아서

직접 원소의 갯수를 파악하고 정렬한 후 set을 이용하여 처리하였습니다.

#include <string>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

vector<pair<string,int> > v;
set<int> visit;

bool cmp(pair<string,int>& a, pair<string,int>& b){
    return a.second < b.second;
}

vector<int> solution(string s) {
    vector<int> answer;
    
    for(int i = 2; i<s.size()-1; i++){
        string str = "";
        str += s[i];
        int cnt = 0;
        while(s[i+1] != '}'){
            str += s[++i];
            if(s[i] == ',') cnt++;
        }
        i += 3;
        v.push_back({str, cnt});
    }
    
    sort(v.begin(), v.end(), cmp);
    
    for(int i = 0; i<v.size(); i++){
        string str = v[i].first;
        for(int j = 0; j<str.size(); j++){
            int num = str[j]-'0';
            while(j+1<str.size() && str[j+1] != ','){
                num = num*10 + (str[++j]-'0');
            }
            j++;
            if(visit.find(num) == visit.end()){
                visit.insert(num);
                answer.push_back(num);
            }
        }
    }
    
    return answer;
}

'algorithm > programmers' 카테고리의 다른 글

programmers 징검다리 건너기  (0) 2020.12.13
Programmers 불량 사용자  (0) 2020.12.12
programmers 길 찾기 게임  (0) 2020.12.11
programmers 오픈채팅방  (0) 2020.12.10
Programmers 실패율  (0) 2020.12.10

programmers 길 찾기 게임 : programmers.co.kr/learn/courses/30/lessons/42892

 

코딩테스트 연습 - 길 찾기 게임

[[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]]

programmers.co.kr

 

2019 kakao blind recruitment Level3 문제인 길 찾기 게임입니다.

 

트리를 만들 수 있도록 모든 정점을 노드로 변환해 준 후에 

1개씩 순회하면서 알맞은 위치에 넣어주시면 됩니다.

 

정확한 설명은 주석을 통하여 작성하였습니다.

 

#include <string>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;

struct node{
    int x,y,idx;
    node* left;
    node* right;
};

node* insertNode(node* parent, node* now){ // 일반적인 바이너리 트리의 삽입 형태 입니다.
    if(parent == NULL) return now;
    if(parent->x > now->x) parent->left = insertNode(parent->left, now);
    else parent->right = insertNode(parent->right, now);
    return parent;
}

vector<int> pre;
vector<int> post;

void preorder(node* now){ // 전위순회
    if(now == NULL) return;
    
    pre.push_back(now->idx);
    preorder(now->left);
    preorder(now->right);
}

void postorder(node* now){ // 후위순회
    if(now == NULL) return;
    
    postorder(now->left);
    postorder(now->right);
    post.push_back(now->idx);
}

bool cmp(node& A, node& B){ // y를 오름차순, x를 내림차순 정렬해줍니다.
    if(A.y != B.y) return A.y > B.y;
    return A.x < B.x;
}

vector<node> v;

vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
    vector<vector<int>> answer;
    
    for(int i = 0; i<nodeinfo.size(); i++){ // 정점을 노드화 해줍니다.
        v.push_back({nodeinfo[i][0], nodeinfo[i][1], i+1});
    }
    
    sort(v.begin(), v.end(), cmp);
    
    node* root = &v[0]; // y가 가장 큰 값이 루트노드가 됩니다.
    for(int i = 1; i<v.size(); i++){
        root = insertNode(root, &v[i]); // 알맞은 위치를 찾아 삽입합니다.
    }
    
    preorder(root);
    postorder(root);
    answer.push_back(pre);
    answer.push_back(post);
    
    return answer;
}

 

'algorithm > programmers' 카테고리의 다른 글

Programmers 불량 사용자  (0) 2020.12.12
programmers 튜플  (0) 2020.12.11
programmers 오픈채팅방  (0) 2020.12.10
Programmers 실패율  (0) 2020.12.10
Programmers 가사 검색  (0) 2020.12.09

programmers 오픈채팅방 : programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

level2 의 2019 kakao blind recruitment 에 나온 문제입니다.

 

문제에서 요구하는대로 순차적으로 모든 문자열들을 검색하면서 uid에 맞는 nickname을 바꿔주면

시간초과가 발생할 것입니다.

 

이 문제는 record의 마지막까지 전부 다 읽은 후에 현재 유저의 '최종'닉네임만 알면

쉽게 해결할 수 있습니다.

모든 유저의 '최종' 닉네임을 알기 위해서 <키,값> 으로 이루어져 사용되는 map을 이용하여 문제를 해결했습니다.

 

#include <string>
#include <vector>
#include <map>
using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, string> m;
    
    for(auto i : record){
        string str = i;
        string enter = "";
        string uid = "";
        string nickname = "";
        
        int idx = 0;
        while(str[idx] != ' ') enter += str[idx++];
        idx++;
        while(idx < str.size() && str[idx] != ' ') uid += str[idx++];
        idx++;
        if(enter.compare("Enter") == 0 || enter.compare("Change") == 0){
            while(idx < str.size() && str[idx] != ' ') nickname += str[idx++];
            m[uid] = nickname;
        }
    }
    
    for(auto i : record){
        string str = i;
        string enter = "";
        string uid = "";
        
        int idx = 0;
        while(str[idx] != ' ') enter += str[idx++];
        idx++;
        while(idx < str.size() && str[idx] != ' ') uid += str[idx++];
        
        if(enter.compare("Change") == 0) continue;
        
        if(enter.compare("Enter") == 0){
            answer.push_back(m[uid]+"님이 들어왔습니다.");
        }
        else{
            answer.push_back(m[uid]+"님이 나갔습니다.");
        }
    }
    
    return answer;
}

 

 

'algorithm > programmers' 카테고리의 다른 글

programmers 튜플  (0) 2020.12.11
programmers 길 찾기 게임  (0) 2020.12.11
Programmers 실패율  (0) 2020.12.10
Programmers 가사 검색  (0) 2020.12.09
Programmers 블록 이동하기  (0) 2020.12.08

programmers 실패율 : programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

kakao 2019 blind recruitment 에 나온 첫번째 문제입니다.

level1에 해당하는 쉬운 난이도의 문제이지만 또 그렇다고 너무 대충대충 풀면 틀리기 쉬운 문제이니

항상 문제를 꼼꼼히 읽고 문제에서 요구하는 조건대로 해결하는 연습을 해야할 것 같습니다.

 

매 스테이지마다 현재 계산해야할 (스테이지에 남은 사람의 수 / 현재 스테이지까지의 전체 사람의 수) 로 나누어주시면 됩니다.

 

실패'율'을 따지는 문제이기 때문에 소수점 계산을 위해 자료형을 정확히 사용하셔야 합니다.

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int stage[501];

bool cmp(pair<double,int> &A, pair<double,int> &B){
    if(A.first != B.first) return A.first>B.first;
    return A.second < B.second;
}

vector<int> solution(int N, vector<int> stages) {
    vector<pair<double, int> > answer;
    vector<int> result;
    
    int people = stages.size();
    for(int i = 0; i<stages.size(); i++) stage[stages[i]]++;
    for(int i = 1; i<=N; i++){
        if(stage[i] == 0){
            answer.push_back({0.0, i});
            continue;
        }
        answer.push_back({(double)stage[i]/people, i});
        people -= stage[i];
    }
    
    sort(answer.begin(), answer.end(), cmp);
    
    for(auto i : answer) result.push_back(i.second);
    
    return result;
}

'algorithm > programmers' 카테고리의 다른 글

programmers 길 찾기 게임  (0) 2020.12.11
programmers 오픈채팅방  (0) 2020.12.10
Programmers 가사 검색  (0) 2020.12.09
Programmers 블록 이동하기  (0) 2020.12.08
Programmers 디스크 컨트롤러 C++  (0) 2020.08.20

+ Recent posts