2017년 9월 17일 일요일

카카오 1차 온라인 코딩 테스트

2018 1ST KAKAO BLIND RECRUITMENT


결과적으로 말하자면 4문제 밖에 못풀었다..
문제는 쉬운편이였다.
나는 쉬운 알고리즘 문제가 나올줄 알았는데 거의 다 구현문제였다.

많은 사람들이 5문제이상, 만점도 많이 받은거 같은데 충분히 그럴 시험이었다 ㅠㅠ
나는 1,2,5,6번을 풀고 3,4,7번을 못풀었다.

3번은 알고리즘을 찾아서 구현해야되서 귀찮아서 넘겼고 4번은 이해가 안되서 바로 넘겼다.
7번 문제를 풀기 시작했는데 남은 2시간내에 풀지 못했다 ㅠㅠ
풀이법은 맞는데 어느순간 스파게티소스가 되서 틀린테케를 잡지를 못했다.
날짜,시간,분,초 단위를 decoder, incoder하는 함수를 만들었으면 깔끔하고 금방풀지 않았을 까 
생각해본다.

사실 푼 문제들도 코드들이 더러운 편이다.
앞으로는 깔끔하게 코드를 작성하는 법과 문제이해를 빠르게 하는 연습을 해야겠다.

1번 문제
#include <string>
#include <vector>
#include <cstring>
using namespace std;
int map[16][16];
vector<string> solution(int N, vector<int> arr1, vector<int> arr2) {
    memset(map, 0sizeof map);
    for (int n = 0;n<N;n++) {
        for (int m = 1 << (N - 1), cnt = 0; m>0;m /= 2, cnt++) {
            int get1 = arr1[n] / m;
            int get2 = arr2[n] / m;
            if (get1 == 1 || get2 == 1) map[n][cnt] |= 1;
            arr1[n] -= get1*m;
            arr2[n] -= get2*m;
        }
    }
 
    vector<string> answer;
    for (int n = 0;n<N;n++) {
        string tmp("");
        for (int m = 0;m<N;m++) {
            if (map[n][m] == 1) tmp = tmp + '#';
            else tmp = tmp + ' ';
        }
        answer.push_back(tmp);
    }
    return answer;
}
cs


2번 문제
#include <string>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int idx;
int Score[4], Bonus[4], Option[4];
void getScore(int time, int &idx, string dartResult) {
    if (dartResult[idx + 1== '0') Score[time] = 10, idx++;
    else Score[time] = dartResult[idx] - '0';
    idx++;
 
    if (dartResult[idx] == 'S') Bonus[time] = 1;
    else if (dartResult[idx] == 'D') Bonus[time] = 2;
    else Bonus[time] = 3;
    idx++;
 
    if (idx == dartResult.size() || !(dartResult[idx] == '*' || dartResult[idx] == '#')) Option[time] = -1;
    else {
        if (dartResult[idx] == '*') Option[time] = 1;
        else if(dartResult[idx] == '#' )Option[time] = 2;
        idx++;
    }
    if (Bonus[time] == 1) Score[time] = Score[time];
    else if (Bonus[time] == 2) Score[time] = (int)pow(Score[time], 2);
    else Score[time] = (int)pow(Score[time], 3);
}
int solution(string dartResult) {
    memset(Score, 0sizeof Score);
    memset(Bonus, 0sizeof Bonus);
    memset(Option, 0sizeof Option);
    idx = 0;
    for (int n = 1;n <= 3;n++) {
        getScore(n, idx, dartResult);
    }
    int answer = 0;
    for (int n = 1;n <= 3;n++) {
        for (int m = n;m <= n + 1;m++) {
            if (Option[m] == 1) Score[n] *= 2;
        }
        if (Option[n] == 2) Score[n] *= -1;
        answer += Score[n];
    }
    return answer;
}
cs

5번 문제
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <iostream>
#include <set>
#include <map>
using namespace std;
multiset<string>::iterator i;
bool NNot(const char &c) {
    if ((c >= 'A' && c <= 'Z'|| (c >= 'a' && c <= 'z')) return false;
    return true;
}
bool BBigger(const char &c) {
    if (c >= 'A' && c <= 'Z'return true;
    return false;
}
int solution(string str1, string str2) {
    multiset<string> set_save1, set_save2;
    map<stringint> save1, save2;
    int N = str1.size(), M = str2.size();
    vector<string> str;
    int up = 0, down = 0;
    for (int n = 1;n < N;n++) {
        if (NNot(str1[n - 1]) || NNot(str1[n])) continue;
        string s = "";
        if (BBigger(str1[n - 1])) s = s + str1[n - 1];
        else s = s + (char)(str1[n - 1- 'a' + 'A');
        if(BBigger(str1[n])) s = s + str1[n];
        else s = s + (char)(str1[n] - 'a' + 'A');
        str.push_back(s);
        set_save1.insert(s);
        if (save1.find(s) == save1.end()) save1[s] = 1;
        else {
            int tmp = save1[s];
            save1[s] = tmp + 1;
        }
    }
    
    for (int m = 1;m < M;m++) {
        if (NNot(str2[m - 1]) || NNot(str2[m])) continue;
        string s = "";
        if (BBigger(str2[m - 1])) s = s + str2[m - 1];
        else s = s + (char)(str2[m - 1- 'a' + 'A');
        if (BBigger(str2[m])) s = s + str2[m];
        else s = s + (char)(str2[m] - 'a' + 'A');
        str.push_back(s);
        if (save2.find(s) == save2.end()) save2[s] = 1;
        else {
            int tmp = save2[s];
            save2[s] = tmp + 1;
        }
        set_save2.insert(s);
        if (set_save1.find(s) != set_save1.end()) {
            auto iter = lower_bound(set_save1.begin(), set_save1.end(), s);
            set_save1.erase(iter);
            up++;
        }
    }
    sort(str.begin(), str.end());
    str.erase(unique(str.begin(), str.end()), str.end());
    for (auto &n : str) {
        if (save1.find(n) != save1.end() && save2.find(n) != save2.end()) {
            down += max(save1[n], save2[n]);
        }
        else if (save1.find(n) != save1.end()) down += save1[n];
        else if (save2.find(n) != save2.end()) down += save2[n];
    }
    if (up == 0 && down == 0return 65536;
    double ans = (double)up / (double)down;
    ans *= 65536;
 
    return (int)ans;
}
cs

6번 문제
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <string>
using namespace std;
int N, M;
bool Erase[31][31];
char map[31][31];
int dy[4][3= { { -1,-1 ,0 },{-1,-1,0},{0,1,1},{0,1,1} };
int dx[4][3= { { -1,0,-1 },{0,1,1},{-1,-1,0},{1,1,0} };
void solve(int y, int x) {
    if (map[y][x] == ' 'return;
    for (int i = 0;i < 4;i++) {
        int cnt = 0;
        for (int j = 0;j < 3;j++) {
            int ny = y + dy[i][j], nx = x + dx[i][j];
            if (ny < 0 || ny >= N || nx < 0 || nx >= M) continue;
            if (map[y][x] == map[ny][nx]) cnt++;
        }
        if (cnt == 3) {
            Erase[y][x] = true;
            for (int j = 0;j < 3;j++) {
                int ny = y + dy[i][j], nx = x + dx[i][j];
                Erase[ny][nx] = true;
            }
        }
    }
}
void goErase() {
    for (int m = 0;m < M;m++) {
        for (int n = N - 1;n >= 0;n--) {
            int x = m, y = n;
            if (map[y][x] != ' ')
            {
                y++;
                while (y < N && map[y][x] == ' ') {
                    swap(map[y][x], map[y - 1][x]), y++;
                }
            }
        }
    }
}
int solution(int a, int b, vector<string> board) {
    N = a, M = b;
    int answer = 0;
    for (int n = 0;n < N;n++) {
        for (int m = 0;m < M;m++)
            map[n][m] = board[n][m];
    }
    while (1) {
        memset(Erase, falsesizeof Erase);
        for (int n = 0;n < N;n++) {
            for (int m = 0;m < M;m++) {
                solve(n, m);
            }
        }
        int cnt = 0;
        for (int n = 0;n < N;n++) {
            for (int m = 0;m < M;m++) {
                if (Erase[n][m]) cnt++, map[n][m] = ' ';
            }
        }
        if (cnt == 0break;
        answer += cnt;
        goErase();
    }
    return answer;
}
cs

댓글 없음:

댓글 쓰기