본문 바로가기
Daily Coding Challenge/Lv1

LV1 | 모의고사

[프로그래머스] 모의고사

🦴 문제 설명

수포자는 수학을 포기한 사람의 준말입니다.
수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

📔 필수 조건

  • 없음

📺 입출력 예

📢 입출력 설명

더보기
  • 입출력 예 #1
    • 수포자 1은 모든 문제를 맞혔습니다.
    • 수포자 2는 모든 문제를 틀렸습니다.
    • 수포자 3은 모든 문제를 틀렸습니다.
  • 입출력 예 #2
    • 모든 사람이 2문제씩을 맞췄습니다.

🖥️ 소스 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> answers) 
{
    vector<int> answer;
    int question = answers.size();
    
    vector<int> student1 = {1, 2, 3, 4, 5};
    vector<int> student2 = {2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    
    vector<int> score(3);
    for (int i = 0; i < answers.size(); i++)
    {
        if (answers[i] == student1[i%student1.size()])
        {
            score[0]++;
        }
        if (answers[i] == student2[i%student2.size()])
        {
            score[1]++;
        }
        if (answers[i] == student3[i%student3.size()])
        {
            score[2]++;
        }
    }
    
    int max = 0;
    for (int i = 0; i < score.size(); i++)
    {
        if (max < score[i])
        {
            max = score[i];
        }
    }
    
    for (int i = 0; i < score.size(); i++)
    {
        if (max == score[i])
        {
            answer.push_back(i+1);
        }
    }
    
    return answer;
}

 

👀 코드 리뷰

1) 정답 찍는 패턴 분석하기
수포자의 찍는 방식을 유심히 보면 규칙성을 지키면서 정답을 찍고 있어요.
우리는 수포자들의 정답찍는 패턴을 알고 있으니 미리 선언해줍시다.

  • 1번: 1, 2, 3, 4, 5
  • 2번: 2, 1, 2, 3, 2, 4, 2 ,5
  • 3번: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5
vector<int> student1 = {1, 2, 3, 4, 5};
vector<int> student2 = {2, 1, 2, 3, 2, 4, 2 ,5};
vector<int> student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

2) 문제의 개수 파악하기
제한 조건을 보면 10,000개의 문제가 최대라고 정의되어 있어요.
1 ~ 10000 까지의 경우의 수를 받아들여야 하니 size() 함수를 통해 길이를 받아옵니다.

int question = answers.size();

int question = answers.size();

3) 점수 채점
문제와 답이 일치하면 정답의 개수를 올려줄거에요.
학생들이 정답을 찍는 패턴을 사전에 조사했기 때문에 쉽게 해결할 수 있어요.
중간에 삭제 또는 수정에 대한 변화가 없고 삽입과 삭제만 있으니까 동적배열을 이용하여 점수를 채점해볼게요.
모듈러 연산자를 사용해서 나온 나머지 값이 문제의 정답과 같아야 함을 알고 있어야 해요.

// 3개의 원소를 0으로 초기화
vector<int> score(3);
// 문제의 길이만큼 반복작업
for (int i = 0; i < question; i++)
{
	if(answers[i] == student1[i%student1.size()])
	{
		score[0]++;
	}
	if(answers[i] == student2[i%student2.size()])
	{
		score[1]++;
	}	
	if(answers[i] == student3[i%student3.size()])
	{
		score[2]++;
	}		
}

 

4) 가장 큰 점수 찾기
학생들의 점수를 가정해봅시다.

  • 1번 : 60점
  • 2번 : 80점
  • 3번 : 70점

for문 첫번째에서는 max가 0으로 정의되었기 때문에 첫번째 학생의 점수가 무조건 들어갈거에요. (빵점이 아닌 경우)
두번째 반복에서부터 첫번째 학생의 점수가 들어간 max의 값과 두번째 학생의 score[1] 점수를 비교해요.
60점 vs 80점 = 80점 승

비교하는 학생의 점수가 높다면 최대 점수를 지니고 있는 max 변수에 현재 학생의 점수를 대입해줘요.
세번째 반복문에서는 2번째 학생의 점수가 들어간 최대 점수 max와 score[2]의 70점을 비교할거에요.
80점 vs 70점 = 80점 승

int max = 0;
// 학생별로 점수 채점
for (int i = 0; i < score.size(); i++)
{
	// 최대 점수보다 학생의 점수가 큰 경우
	if(max < score[i])
	{ 
		// 학생의 점수를 최대 점수에 대입
		max = count[i];
	}
}
// 최대 점수를 가진 학생 찾기
for (int i = 0; i < score.size(); i++)
{
    if (max == score[i])
    {
			  // 최대 점수를 지닌 학생을 요소에 추가
        answer.push_back(i+1);
    }
}
return answer;

 

'Daily Coding Challenge > Lv1' 카테고리의 다른 글

LV1 | 두 개 뽑아서 더하기  (0) 2020.11.04
LV1 | 모든 레코드 조회하기  (0) 2020.11.04
LV4 | 멀쩡한 사각형  (0) 2020.11.04