2018 카카오 블라인드 공채 1차 코테 문제

5시간을 잡고 실전처럼 진행하였으며 코드의 최적화나 알고리즘은 정확하지 않음.


코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr


1번문제로 약 10분 정도 걸렸다.

문자열 처리 문제였으며 딱히 필요한 알고리즘은 없었다.

점수가 10일때 처리를 따로 해주어야 했다.

string 형태에선 10은 2칸이기 때문에 1일때 뒤에 0인지 아닌지 판단하여 점수를 계산하고 인덱스처리를 해주어야했다.

옵션에 * 가 직전의 수도 변경하므로 직전의 수도 저장 해두어야 풀 수 있다.

그 외에는 그냥 조건에 따라 풀면 된다.

#include <string>

using namespace std;

int solution(string s)
{
	int answer = 0;
	int temp = 0, prev = 0;

	for (int i = 0; i < s.size(); i++)
	{

		if (s[i] == '1')
		{
			if (s[i + 1] == '0')
			{
				i++;
				temp = 10;
			}
			else
				temp = 1;
		}
		else
			temp = s[i] - '0';

		if (s[i + 1] == 'D')
			temp *= temp;
		else if (s[i + 1] == 'T')
			temp *= temp * temp;
		i++;

		if (s[i + 1] == '*')
		{
			answer += prev;
			temp *= 2;
			i++;
		}
		else if (s[i + 1] == '#')
		{
			temp *= -1;
			i++;
		}

		answer += temp;
		prev = temp;
	}

	return answer;
}

queue를 써서 풀면 딱히 어렵지 않았다.

#include <string>
#include <vector>
#include <queue>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    queue<int> q;

    int days;
    for (int i = 0; i < progresses.size(); i++)
    {
        days = 100 - progresses[i];
        if (days % speeds[i] == 0)
            days = days / speeds[i];
        else
            days = days / speeds[i] + 1;
        q.push(days);
    }

    while (!q.empty())
    {
        int cur = q.front();
        int num = 0;
        while (q.front() <= cur && !q.empty())
        {
            num++;
            q.pop();
        }

        answer.push_back(num);
    }

    return answer;
}

어렵진 않았음.

10진법을 3진법으로 바꾸는 문제이다.  다만 3으로 나누어 떨어질때, 별도의 처리가 필요했다.

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

using namespace std;

string solution(int n) {
    string answer = "";


    for (int i = 3; n != 0; n /= 3)
    {
        if (n % 3 == 1)
            answer += '1';
        else if (n % 3 == 2)
            answer += '2';
        else
        {
            answer += '4';
            n -= 3;
        }
    }

    reverse(answer.begin(), answer.end());

    return answer;
}

지워지는 사각형은 가로 세로로 보았을때 W + H개 이다.

그리고 그 중 꼭지점이 만나는것 gcd개를 제외하면 된다.

따라서 전체 사각형 개수중 W + H - gcd를 빼면 된다.

using namespace std;

long long GCD(long long a, long long b)
{
    if (b == 0)
        return a;
    else
        return GCD(b, a % b);
}

long long solution(int w, int h) {
    long long W = w;
    long long H = h;
    long long answer = W * H;
    long long gcd = GCD(W, H);

    answer = answer - (W + H - gcd);
    
    return answer;
}

C++에는 split이 없어서 입력을 처리하는데 더 오래 걸린거 같다.

실제 코테에선 이런 문제는 python을 써서 풀 것 같다.

입력을 제외하면 구현은 딱히 어렵지 않다. map을 써서 hash로 id name을 구별 하면 된다.

#include <iostream>

#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <utility>

using namespace std;

vector<string> TRANS_RECORD(string s)
{
    vector<string> temp;

    int rev = 0;
    for (int i = 0; i < s.size(); i++)
        if (s[i] == ' ')
        {
            temp.push_back(s.substr(rev, i));
            rev = i + 1;
            break;
        }

    if (temp[0] == "Leave")
        temp.push_back(s.substr(rev));
    else
        for(int i = 0; i < s.size() - rev; i++)
            if (s[rev + i] == ' ')
            {
                temp.push_back(s.substr(rev, i));
                temp.push_back(s.substr(rev + i + 1, s.size() - rev - i - 1));
                break;
            }

    return temp;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    vector<vector<string>> translated_record;
    map<string, string> user;

    for (int i = 0; i < record.size(); i++)
        translated_record.push_back(TRANS_RECORD(record[i]));

    for (int i = 0; i < translated_record.size(); i++)
    {
        if (translated_record[i][0] != "Leave")
        {
            if (user.find(translated_record[i][1]) == user.end())
                user.insert(pair<string, string>(translated_record[i][1], translated_record[i][2]));
            else
                user[translated_record[i][1]] = translated_record[i][2];
        }
    }

    for (int i = 0; i < translated_record.size(); i++)
    {
        if (translated_record[i][0] == "Enter")
            answer.push_back(user[translated_record[i][1]] + "님이 들어왔습니다.");
        else if(translated_record[i][0] == "Leave")
            answer.push_back(user[translated_record[i][1]] + "님이 나갔습니다.");
    }
    return answer;
}

int main()
{
    vector<string> temp = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
    solution(temp);
}

+ Recent posts