본문 바로가기

code/programmers

[프로그래머스] 2019 카카오 블라인드(2018 시행) 2번 실패율

문제 링크:

 

코딩테스트 연습 - 실패율 | 프로그래머스

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다. 이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를

programmers.co.kr

해설 링크:

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 […]

tech.kakao.com

코드:

/* 1. stage값끼리 곱하면 int의 범위를 벗어남 -> long long casting */

#include <vector>
#include <algorithm>
#include <functional>
#include <tuple>
#include <set>
#include <map>

using namespace std;

bool cmp(tuple<int, int, int> a, tuple<int, int, int> b) {
	if ((long long)get<0>(a) * get<1>(b) == (long long)get<0>(b) * get<1>(a))   /* 1 */
		return get<2>(a) < get<2>(b);
	return (long long)get<0>(a) * get<1>(b) > (long long)get<0>(b) * get<1>(a); /* 1 */
}

vector<int> solution(int N, vector<int> stages) {
    set<int> nv; 
	for (int n = 1; n <= N; ++n)
		nv.emplace(n);

	map<int, int, greater<int>> map;
	for (auto stage : stages) {
		auto it = map.find(stage);
		if (it == map.end())
			map[stage] = 1;
		else
			++((*it).second);
		nv.erase(stage);
	}

	vector<tuple<int, int, int>> vct;
	int acc = 0;
	if ((*map.begin()).first == N + 1) {
		acc = map[N + 1];
		map.erase(N + 1);
	}
	for (auto p : map) {
		acc += p.second;
		vct.emplace_back(p.second, acc, p.first);
	}
	sort(vct.begin(), vct.end(), cmp);
 
	vector<int> answer;
	for(auto t : vct)
		answer.push_back(get<2>(t));
	for (auto i : nv)
		answer.push_back(i);
    
    return answer;
}