https://programmers.co.kr/learn/courses/30/lessons/42840
문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한 조건
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
누설
나도 수포자였는데 문제부터 너무 반갑고 재밌네.
나의 수능날 수학 시험 시간은 전략적 휴식시간이었다.
그 학교에서 수학 시험 시간에 장 비우러 나간건 나밖에 없을듯 .
그거 덕분에 영어 시험을 매우 잘 봤다. 장을 깨끗이 비워서 ^0^
도시락도 너무 잘 먹었었다. 울 엄마의 불고기 & 아욱된장국 잊을 수가 없어...
정답 코드
기본적으로 몇가지 부족한 부분을 짚어보자면,
algorithm 헤더의 max( ... ) 함수의 중첩을 이용하면 3개 이상의 변수의 최대값 계산을 쉽게 할 수 있는데도
C++ 흐접인 나는 그냥 find 함수를 새로 만들어 최대값을 찾았다.
또한 맨처음엔 정답지또한 vector로 만들면 되는데 그 생각을 못해 인터넷의 힘을 빌렸다. (언제나 그렇지만)
중요 아이디어는 for문을 통해, 채점지의 반복되는 index 범위를 생각하여 식을 짜는 것 (이게 뭔소린지 이해 못하시겠으면 미안합니다. )
만약 문제가 20개고 정답이 5개단위로 반복되면 index i의 Increment 는 3번(0~3) 이루어지면된다.
그리고 A = B = C 인 경우도 find함수를 통해 오류없이 return이 되는지 의아했는데 테스트케이스 모두 통과하는거보면
상관이 없나보다.
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
|
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int find(int a, int b, int c) {
int temp = a;
if (temp > b) {
return temp > c ? temp : c;
}
else {
return b > c ? b : c;
}
}
vector<int> solution(vector<int> answers) {
vector<int> answer;
int cor[3] = { 0 };
int size = answers.size();
int ans;
int i = 0;
vector<int>answer1{ 1,2,3,4,5 };
vector<int>answer2{ 2,1,2,3,2,4,2,5 };
vector<int>answer3{ 3,3,1,1,2,2,4,4,5,5 };
for (i = 0; i < size; i++) {
ans = answers[i];
if (ans == answer1[i % 5]) cor[0]++;
if (ans == answer2[i % 8]) cor[1]++;
if (ans == answer3[i % 10]) cor[2]++;
}
int Max_val = find(cor[0], cor[1], cor[2]);
for (i = 0; i < 3; i++) {
if (Max_val == cor[i]) answer.push_back(i + 1);
}
return answer;
}
|
cs |
마지막에 for문으로 push back 하는건 좀 멋있고 깔쌈한 코딩정리인듯.
지저분하게 3줄 쓸수도 있는건데.
** find 함수를 따로 작성하지않아도 기본적으로 제공하는 max()함수를 이용.
'프로그래밍 > programmers&bj' 카테고리의 다른 글
[C++][알고리즘] 프로그래머스::전화 번호 목록 (0) | 2019.08.20 |
---|---|
[C++][알고리즘] 프로그래머스::체육복 풀이 (0) | 2019.08.20 |
[C++][알고리즘] 프로그래머스 "더맵게" 문제(heap) (0) | 2019.08.18 |
[JAVA][알고리즘] 백준 1330번 두 수 비교하기 (0) | 2019.08.08 |
[C][알고리즘] 백준 5532번 풀이 (0) | 2019.08.08 |