Code KATA/알고리즘 코드카타

[2025.01.07] 모의고사

iiblueblue 2025. 1. 27. 11:25

문제 설명

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

 

 

입출력 예

a b return
[1, 2, 3, 4, 5] [1] 수포자1은 모든 문제를 맞혔습니다.
수포자2는 모든 문제를 틀렸습니다.
수포자3은 모든 문제를 틀렸습니다.
[1, 3, 2, 4, 2] [1, 2, 3] 모든 사람이 2문제씩을 맞췄습니다.

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer; // 각 학생별 정답 수
    vector<int> my_return; // 리턴값(정답)
    
    vector<int> student1={1, 2, 3, 4, 5}; // 1번 학생이 찍는 방식
    vector<int> student2={2, 1, 2, 3, 2, 4, 2, 5}; // 2번 학생이 찍는 방식
    vector<int> student3={3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 3번 학생이 찍는 방식
    
    // 초기화
    answer.push_back(0);
    answer.push_back(0);
    answer.push_back(0);
    
    // 각 학생마다 정답 횟수 구하기
    for(int i=0; i<answers.size(); i++)
    {
        // 1번 학생 정답 여부 확인
        if(answers[i]==student1[i%student1.size()])
        {
            answer[0]+=1;
        }
        
        // 2번 학생 정답 여부 확인
        if(answers[i]==student2[i%student2.size()])
        {
            answer[1]+=1;
        }
        
        // 3번 학생 정답 여부 확인
        if(answers[i]==student3[i%student3.size()])
        {
            answer[2]+=1;
        }
    }
    
    // 최대값 인덱스 찾기
    int max_index=max_element(answer.begin(), answer.end())-answer.begin();
    
    // 리턴값 만들기
    if(answer[0]==answer[1]&&answer[1]==answer[2]) // 모든 값이 같을 때
    {
        my_return.push_back(1);
        my_return.push_back(2);
        my_return.push_back(3);
    }
    else if(answer[0]==answer[1]&&max_index==0) // 1번과 2번 학생의 점수가 같고 그 둘이 가장 많은 문제를 맞춘 것일 때
    {
        my_return.push_back(1);
        my_return.push_back(2);
    }
    else if(answer[1]==answer[2]&&max_index==1) // 2번과 3번 학생의 점수가 같고 그 둘이 가장 많은 문제를 맞춘 것일 때
    {
        my_return.push_back(2);
        my_return.push_back(3);
    }
    else if(answer[0]==answer[2]&&max_index==0) // 1번과 3번 학생의 점수가 같고 그 둘이 가장 많은 문제를 맞춘 것일 때
    {
        my_return.push_back(1);
        my_return.push_back(3);
    }
    else // 가장 많은 문제를 맞춘 학생이 중복이 없을 때
    {
        my_return.push_back(max_index+1);
    }
    
    return my_return;
    
    
}

우선 문제를 모두 돌며 각각 몇개씩 맞추었는지부터 계산을 해야 한다. 그 다음엔 중복이 있는 경우들을 분리하여 어떤 리턴값을 반환해야하는지 조건에 따라 처리하여야 한다.

 

먼저 문제를 하나씩 반복문으로 돌리며 1, 2, 3번 학생이 문제를 맞추었는지 맞추었다면 맞춘 횟수를 저장해준다. 학생 1, 2, 3의 정답을 찍는 패텬 한 사이클의 요소 개수가 다 다르기 때문에 나머지 연산을 활용해 인덱스로 한다. 맞추었다면 answer의 0~2 인덱스에 1~3 학생의 정답횟수를 각각 저장한다.

 

각각 몇 개의 정답을 맞췄는지 계산이 끝났다면 일단 최대값을 가진 학생의 인덱스를 찾는다. max_element를 이용하여 최대값을 찾고 answer.begin()을 빼서 인덱스를 구해준다.

 

마지막으로 중복이 있는지 확인해야 한다. 아래 다섯 가지 경우를 조건으로 하여 상황을 파악한다.

  • 모두 같은 점수를 가졌을 때
  • 1번과 2번 학생의 점수가 같고 그 둘이 최대 점수일 때
  • 2번과 3번 학생의 점수가 같고 그 둘이 최대 점수일 때
  • 1번과 3번 학생의 점수가 같고 그 둘이 최대 점수일 때
  • 최대 점수인 학생이 중복이 없을 때(혼자일 때)

my_return 값에 상황에 맞는 리턴값을 만들고 리턴해준다.

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

'Code KATA > 알고리즘 코드카타' 카테고리의 다른 글

[2025.01.29] 덧칠하기  (0) 2025.01.29
[2025.01.28] 소수 만들기  (0) 2025.01.28
[2025.01.24] 2016년  (1) 2025.01.24
[2025.01.23] 명예의 전당 (1)  (1) 2025.01.23
[2025.01.22] 콜라 문제  (0) 2025.01.22