[프로그래머스/C++] ㅡ LV1 - 모의고사
2021. 2. 24. 15:46ㆍ필요/코딩테스트(프로그래머스)
문제
programmers.co.kr/learn/courses/30/lessons/42840
풀이
#include <vector>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> answer;
int cnta=0, cntb=0, cntc=0;
int a[] = {1, 2, 3, 4, 5};
int b[] = {2, 1, 2, 3, 2, 4, 2, 5};
int c[] = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
for (int i=0; i<answers.size(); i++) { // 각 수포자들과 답안 비교
if (answers[i] == a[i%5]) {
cnta++;
}
if (answers[i] == b[i%8]) {
cntb++;
}
if (answers[i] == c[i%10]) {
cntc++;
}
}
if (cnta >= cntb && cnta >= cntc) {
answer.push_back(1);
}
if (cntb >= cnta && cntb >= cntc) {
answer.push_back(2);
}
if (cntc >= cnta && cntc >= cntb) {
answer.push_back(3);
}
return answer;
}
개념
값의 참조(비교)를 위해 배열에 특정한 값이 계속 반복되어야 한다.
무한히 반복될 수는 없다.
%(나머지) 연산자를 이용하면, 특정 배열 내부에서 반복하여 계속 참조할 수 있다.
풀이
문제는 두가지 부분으로 나눌 수 있겠다.
① 정답과 각 수포자들의 답 비교
② 각 수포자들의 점수 비교해서 정렬
for문을 통해 answer 배열의 인자마다, 수포자들의 배열과 비교한다.
답이 같으면 각 cnt 변수를 ++ 한다.
정렬해야할 숫자는 최대 3개이다.
따라서 sort 등을 사용하는게 아니라, C 언어가 절차지향 언어임을 활용한다.
코드의 순서에 따라 실행에 반영이 되므로, 1번 수포자 > 2번 수포자 > 3번 수포자 순으로 가장 높은 점수임을 확인하는 if문을 나열하면 된다.
+a
직관적으로 코드를 짰는데, 조금은 무식하게도 느껴진다.
다른 사람들이 풀은 방법을 보면, ①과정은 다 유사하다.
② 과정에 있어, for문을 사용하는 경우가 은근 많았다. 순서의 문제는 index 인자로 해결한 경우이다.
수포자들이 좀 더 많다면, for문을 사용하는 것이 유리하다!
'필요 > 코딩테스트(프로그래머스)' 카테고리의 다른 글
[프로그래머스/C++] ㅡ LV1 - 체육복 (0) | 2021.02.25 |
---|---|
[프로그래머스/C++] ㅡ LV1 - K번째수 (0) | 2021.02.24 |
[프로그래머스/C++] ㅡ LV1 - 신규 아이디 추천 (0) | 2021.02.23 |
[프로그래머스/C++] ㅡ LV1 - 완주하지 못한 선수 (0) | 2021.02.23 |
[프로그래머스/C++] ㅡ LV1 - 두 개 뽑아서 더하기 (0) | 2021.02.21 |