만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[C++][알고리즘] 프로그래머스 "모의고사" 문제(완전탐색) 코드

D36choi 2019. 8. 18. 21:14
728x90

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,

programmers.co.kr

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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()함수를 이용.