無限

몸은 현실 마음은 낭만

Develop & Journal

코딩테스트 연습

프로그래머스 모의고사

알파 조 2024. 3. 16. 23:01
728x90
반응형
SMALL

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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하는 값을 오름차순 정렬해주세요.

입출력 예

answers return

[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

이 문제를 보고 어떻게 하면 백터 answer과 각각의 수열을 비교하면 맞은 문제의 개수를 셀까?였다.

쉽게 말해 각각의 수열은 크기가 다르고 백터 answer도 크기를 알 수 없기 때문에 비교를 어떻게 해야 될지가 관건이다. 다음은 내가 생각한 알고리즘이다.

 

알고리즘

  1. 먼저 각각의 수열을 담기 위해 백터 3개를 선언해주고 초기화해준다.
  2. 각가의 수열이 문제를 맞추는 개수를 저장하는 변수를 선언해준다.
  3. 문제와 각각의 수열을 비교해주어 맞은 문제의 수를 카운트해준다.
  4. 각 수열 중에서 문제를 가장 많이 맞춘 수열을 찾아낸다.
  5. 가장 많이 맞춘 수열의 넘버를 우선순위 큐에 넣어준다.(이는 따로 정렬 없이 바로 정렬되게 하기 위함이다.)
  6. 가장 많이 맞춘 수열과 동일한 수를 맞췄다면 마찬가지로 우선순위 큐에 넣어준다.
  7. 백터answer1에 큐의 값을 대입해준다.
  8. 이렇게 해서 최종적으로 answer1을 반환해준다.

 

코드

#include <bits/stdc++.h>
using namespace std;

vector<int> solution(vector<int> answers) {
    priority_queue<int, vector<int>, greater<int>> answer;
    vector<int> answer1;
    vector<int> one={1, 2, 3, 4, 5};
    vector<int> two={2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> three={3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    
    int cnt1=0,cnt2=0,cnt3=0;
    
    for(int i=0;i<answers.size();i++){
        if(answers[i]==one[i%one.size()])
            cnt1++;
        if(answers[i]==two[i%two.size()])
            cnt2++;
        if(answers[i]==three[i%three.size()])
            cnt3++;
    }
    
   int maxinum=max({cnt1,cnt2,cnt3});
    if(maxinum==cnt1)
        answer.push(1);
    if(maxinum==cnt2)
        answer.push(2);
    if(maxinum==cnt3)
        answer.push(3);
    
     while (!answer.empty()) {
       answer1.push_back(answer.top());
        answer.pop();
    }
    
    cout<<cnt1<<cnt2<<cnt3;
    return answer1;
}

코드를 작성하면서 아래의 코드가 가장 핵심적이고 고민을 많이 했다. 코드를 작성하고 나니 정말 단순한 풀이 법이었다.

if(answers[i]==one[i%one.size()])
    cnt1++
if(answers[i]==two[i%two.size()])
    cnt2++;
if(answers[i]==three[i%three.size()])
    cnt3++;

answers[i]==one[i%one.size()] 이렇게 작성하면 일정 수 만큼 반복하는 수열에 맞게 원소를 비교할 수 있다.

반응형
LIST

'코딩테스트 연습' 카테고리의 다른 글

프로그래머스 피로도  (0) 2024.03.20
프로그래머스 카펫  (0) 2024.03.19
프로그래머스 소수 찾기  (1) 2024.03.14
프로그래머스 최소직사각형  (1) 2024.03.14
프로그래머스 H-Index  (0) 2024.03.13