※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소입니다.
https://programmers.co.kr/learn/courses/30/lessons/42889
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
3.1 C++
3.2 Python
4. 결과
1. 문제 설명
슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다. 이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라. |
실패율은 다음과 같이 정의한다.
|
문제!!
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라. |
제한사항
|
예시
N | stages | return |
5 | [2, 1, 2, 6, 2, 4, 3, 3] | [3, 4, 2, 1, 5] |
4 | [4, 4, 4, 4, 4] | [4, 1, 2, 3] |
4 | [2, 2, 2, 2, 2] | [2, 1, 3, 4] |
2 | [2 ,2 ,3] | [2 ,1] |
입출력 예 #1
2번 스테이지에는 총 7명의 사용자가 도전했으며, 이 중 3명의 사용자가 아직 클리어하지 못했다. 따라서 2번 스테이지의 실패율은 다음과 같다.
마찬가지로 나머지 스테이지의 실패율은 다음과 같다.
각 스테이지의 번호를 실패율의 내림차순으로 정렬하면 다음과 같다.
입출력 예 #2 모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.
|
2. 문제풀이
일단 처음했던 작업은 스테이지별로 몇명이 있는지 분리하는 작업이었습니다. 배열을 써도되겠지만 저는 map을 이용하여 분리했습니다. 각 스테이지별 인원으로 분리를 한후에 실패율을 계산했습니다. 각 스테이지에서 못깨는 인원 / 현재스테이지까지 올라왔던 인원로 실패율을 계산했고 다음 인원은 현재인원 - 현재스테이지를 못깬인원으로 해서 다음스테이지 인원을 구했습니다. 각 스테이지와 실페율을 pair로 묶어서 정렬한후 벡터에 담아 반환했습니다. 예외적으로 스테이지가 남았는데 인원이 없거나 현재 인원이 없는경우 실패율을 0으로 처리했습니다. |
3. 소스코드
3.1 C++ 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
bool compare(pair<int, double>& a, pair<int, double>& b) {
if (a.second == b.second)
return a.first < b.first;
return a.second > b.second;
}
vector<int> solution(int N, vector<int> stages) {
vector<int> answer;
sort(stages.begin(), stages.end());
vector<pair<int, double>> percent; //각스테이지와 스테이지 실패율
map<int, int> stagesClear; //각 스테이지별 머무는 인원
int pCount = stages.size(); //스테이지 클리어 인원수
for (int j = 0; j < stages.size(); j++) //스테이지 클리어 인원수 분리
stagesClear[stages[j]]++;
for (int i = 1; i <= N; i++) { //1스테이지부터 N스테이지까지 순회
if (!pCount || !stagesClear[i])//스테이지와 못깬인원/총 인원으로 나눔
percent.push_back({i, 0});
else
percent.push_back({i, (double)stagesClear[i] / pCount});
pCount -= stagesClear[i]; //깨지못한 인원들만큼 빼기
}
sort(percent.begin(), percent.end(), compare);//내림차순으로 정렬
for (auto p : percent) //정답에 옮기기
answer.push_back(p.first);
return answer;
}
void print(int N, vector<int> stages, vector<int> answer) {
vector<int> t = solution(N, stages);
if (answer == t)
cout << "정답" << endl;
else
cout << "틀림" << endl;
}
int main() {
print(4, { 2,2,2,2,2 }, { 2,1,3,4 });
print(4, { 4,4,4,4,4 }, { 4,1,2,3 });
print(5, { 2,1,2,6,2,4,3,3 }, { 3,4,2,1,5 });
return 0;
}
|
3.2 Python 코드
def solution(N, stages):
answer = []
users = [ 0 for _ in range(N+1) ]
failed_percent = []
size = len(stages)
for i in stages:
users[i-1] += 1
for i in range(N):
if size == 0 or users[i] == 0 :
failed_percent.append((i+1, 0))
else:
failed_percent.append((i+1, users[i]/size))
size -= users[i]
failed_percent.sort(key = lambda x : (-x[1], x[0]))
for i, j in failed_percent:
answer.append(i)
return answer
if __name__ == "__main__":
N_list = [5, 4, 2, 4]
stages_list = [
[2, 1, 2, 6, 2, 4, 3, 3],
[4, 4, 4, 4, 4],
[2, 2, 3],
[2, 2, 2, 2, 2]
]
answer_list = [
[3, 4, 2, 1, 5],
[4, 1, 2, 3],
[2, 1],
[2, 1, 3, 4]
]
for i in range(4):
if solution(N_list[i], stages_list[i]) == answer_list[i]:
print('{}번 정답'.format(i+1))
else:
print('{}번 틀림'.format(i+1))
|
4. 결과
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
숫자야구 C++(완전탐색)[프로그래머스] (0) | 2019.12.02 |
---|---|
소수찾기 C++(완전탐색)[프로그래머스] (5) | 2019.12.01 |
짝지어 제거하기 C++(팁스다운2017)[프로그래머스] (1) | 2019.11.29 |
모의고사 C++(완전탐색)[프로그래머스] (0) | 2019.11.27 |
H-index C++(정렬)[프로그래머스] (0) | 2019.11.26 |
댓글