프로그래머스 모의고사

1. 문제 링크

(프로그래머스 모의고사)[https://programmers.co.kr/learn/courses/30/lessons/42840]

2. 문제 조건

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 함수를 작성해주세요.

2.1. 제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

3. 컴퓨팅 사고

  • 모의고사 문제를 풀때 가장 중요한것은 수포자가 찍는 방식에 대한 패턴을 찾아내는것입니다.
  • 1번~3번 수포자들의 패턴을 찾아보면
1
2
3
int st1[5] = {1,2,3,4,5};
int st2[8] = {2,1,2,3,2,4,2,5};
int st3[10] = {3,3,1,1,2,2,4,4,5,5};

다음과 같은 패턴을 찾을 수 있습니다.

특정 패턴 규칙 구하기
5번째마다 같은패턴 8번째마다 같은 패턴 10번째마다 같은 패턴 이것을 코드로 나타내면 어떻게 나타낼 수 있을까요?

바로 (idx % 5),(idx % 8),(idx % 10) 의 형식으로 나타내면 5번째마다 패턴으로 규칙적으로 구할 수 있습니다.

예를 들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
i=0 일 경우 0 % 5 = 0

i=1 일 경우 1 % 5 = 1

i=2 일 경우 2 % 5 = 2

i=3 일 경우 3 % 5 = 3

i=4 일 경우 4 % 5 = 4

i=5 일 경우 5 % 5 = 0

i=0부터 시작하며 i번째는 시험문제라고 생각하겠습니다.

i가 5가 되는 순간 나머지는 0이 되게됩니다. 따라서 0~4까지 총 5번의 패턴을 확인할 수 있는것입니다.

만약 나머지값이 answer[i]과 같다면, 즉 문제의 정답과 같다면 문제의 정답의 개수를 늘려주는것입니다.

가장 높은 점수 찾기

그래서 총 3명의 수포자들중에서 가장 높은 점수를 얻은 사람을 winner을 구해주고 만약 다시 모든 수포자의 점수를 점수가 가장높은점수와 같을 경우 answer에 값을 넣어주게됩니다. answer에는 수포자의 1,2,3번중 가장높은 점수를 받은 사람이 들어가있게됩니다. (단, 여럿일 경우도 존재하므로 그부분도 확인해야합니다)

4. 소스 코드

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
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int st1[5] = {1,2,3,4,5};
int st2[8] = {2,1,2,3,2,4,2,5};
int st3[10] = {3,3,1,1,2,2,4,4,5,5};

vector<int> solution(vector<int> answer) {

int winner;
vector<int> st_score(3);
vector<int> answers;
for(int i=0; i<answer.size(); i++){

if(st1[i % 5] == answer[i]){
st_score[0]++;
}
if(st2[i % 8] == answer[i]){
st_score[1]++;
}
if(st3[i % 10] == answer[i]){
st_score[2]++;
}
}
winner = max(max(st_score[0], st_score[1]),st_score[2]);
for(int i=0; i<3; i++){
if(winner == st_score[i]){
answers.push_back(i+1);
}
}

return answers;
}
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
import java.util.ArrayList;
import java.util.List;
public class 모의고사 {

public static void main(String[] args) {

List<Integer> winner = new ArrayList<>();

int[] student1 = {1, 2, 3, 4, 5};
int[] student2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

int[] students = {0,0,0};
int[] answers = {1,2,3,4,5};
int[] answer = {}; // 출력값

for(int i=0; i<answers.length; i++){
if(student1[i % student1.length] == answers[i]){
students[0]++;
}
if(student2[i%student2.length] == answers[i]){
students[1]++;
}
if(student3[i%student3.length] == answers[i]){
students[2]++;
}
}

int win = students[0];
// 가장높은 점수를 받은 사람 찾기
for(int i=0; i<students.length; i++){
if(win < students[i]){
win = students[i];
}
}
// 같은 값을 가진 여럿사람일 경우도 있기때문에 확인을 해서 넣어줍니다.
for(int i=0; i<students.length; i++){
if(win == students[i]){
winner.add(i);
}
}
answer = new int [winner.size()];
// 가장 높은 점수를 가진사람의 값을 answer에 담아줍니다.
for (int i=0; i<winner.size();i++){
answer[i]=winner.get(i)+1;
}
}

}