상세 컨텐츠

본문 제목

[프로그래머스] 모의고사 (완전탐색) (Python, C++)

PROGRAMMING/Algorithm

by koharin 2021. 1. 10. 22:52

본문

728x90
반응형

문제 설명

  • 각각 3명의 수포자들은 일정한 패턴으로 1~5 중에서 찍는다. 정답이 주어졌을 때 채점해서 가장 높은 점수를 가진 사람을 배열 answer에 담아 리턴한다.
  • 만약 가장 높은 점수가 두 개 이상일 경우, 오름차순으로 배열에 담아 리턴한다.

Python

def solution(answers):
    answer = []; score=[0,0,0]
    spj=[[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    for i in range(len(answers)):
	    if len(answers) > len(spj[0]): spj[0].append(spj[0][i])
	    if len(answers) > len(spj[1]): spj[1].append(spj[1][i])
	    if len(answers) > len(spj[2]): spj[2].append(spj[2][i])
    for i in range(3):
        score[i]=len([m for m, n in zip(answers, spj[i]) if m == n])
    for i in range(3):
	    if score[i] == max(score): answer.append(i+1)
    return answer

1. spj 배열에 수포자 1, 2, 3이 찍는 숫자 패턴을 담는다.

 

2. 첫 번째 반복문: 배열 answers와 길이를 맞추기 위해 패턴에 맞춰 answers 길이까지 각 배열에 값을 추가한다. zip 함수는 동일한 길이의 자료형을 대상으로 묶어주기 때문에 길이를 맞춰줬다.

 

3. 두 번째 반복문: score 배열은 각 수포자 1,2,3의 점수에 대한 배열이다. answers에서의 m과 spj[i]의 n을 비교해서 같으면 그 값을 가져온다. 해당 배열의 전체 길이로 해당 수포자가 맞은 문제 수, 즉 점수를 구하고 score[i]에 넣는다.

 

아래의 연산에 사용되는 an, d는 위와 같다.

 

zip을 사용할 경우, 각 an, d[0]의 동일한 인덱스 위치의 값을 묶어준다. list로 확인하면 위와 같다.

 

for m, n in zip(an, d[i])에서 m,n은 (1,1)에서 각각 1과 1에 해당한다. 따라서 이 방법으로 m과 n이 같은지 비교하고 같으면 해당 값을 배열을 넣도록 해서 맞는 문제의 수를 구한다.

 

 

4. 세 번째 반복문: score에서 max가 두 개 이상일 경우를 위한 반복문으로, max(score)와 같으면 해당 인덱스+1을 answer에 넣는다. score가 차례로 수포자 1,2,3에 해당되므로 차례대로 넣게 된다.

 


C++

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

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> score = {0,0,0};
    vector<vector<int>> num
    {
        {1, 2, 3, 4, 5},
        {2, 1, 2, 3, 2, 4, 2, 5},
        {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
    };
  
    for(int i = 0; i < answers.size(); i++){
        if(answers[i] == num[0].at(i % num[0].size())) score[0]++;
        if(answers[i] == num[1].at(i % num[1].size())) score[1]++;
        if(answers[i] == num[2].at(i % num[2].size())) score[2]++;
    }
    
    for(int i=0; i< score.size(); i++){
        if(score[i] == *max_element(score.begin(), score.end())) 
            answer.push_back(i+1);
    }
    
    return answer;
}
  • 파이썬은 zip을 사용해서 각 원소 값을 비교하기 위해 길이를 맞춰줬는데, c++에서는 그러지 않고 각각 반복되는 패턴이 있으므로 수포자 1,2,3마다 배열 마지막이면 다시 처음으로 돌아가서 비교하도록 num[0].at(i % num[0].size()))로 수포자들의 값을 줬다. 
  • 같은 값이면 score 배열의 각 순서에 값을 증가시켰다.
  • score 배열 내 최댓값의 경우 max_element 를 사용했고, iterator(반복자)이기 때문에 *를 앞에 붙인다.
    • iterator(반복자): 포인터와 비슷한 개념, 컨테이너에 저장된 원소를 참조할 때 사용
  • max인 경우에만 answer에 수포자에 해당하는 수를 push_back 으로 넣는다.

 

728x90
반응형

관련글 더보기