[프로그래머스: 완전탐색] 모의고사

박민주·2021년 10월 4일
0

Programmers

목록 보기
1/13
post-thumbnail

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

처음으로 프로그래머스에서 받아본 점수..(●'◡'●)
지난 학기 자료구조 과제로 프로그래머스에 있는 문제들을 풀기는 했는데
다 C로 구현해야 해서 채점을 해보지 못했었다

아까 나동빈님의 대기업 코딩테스트 준비 관련 영상을 봤는데
완전 탐색 먼저 풀어야 한다고 하셔서 프로그래머스에서 완전 탐색 문제를 찾아보았다!
그 중 꽤 많은 사람들이 맞은 것으로 뜨는 '모의고사' 문제를 풀었다

처음에 테스트케이스 전부 실패로 떠서 역시 프로그래머스는 호락호락하지 않은건가 했는데
내가 그냥 algorithm 헤더파일 포함하는 걸 까먹었던 거였다 ㅎ

< 스케치 >

CODE

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> answerPattern_1 = {1, 2, 3, 4, 5};
    vector<int> answerPattern_2 = {2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> answerPattern_3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    int idx_1 = 0, idx_2 = 0, idx_3 = 0;
    int score_1 = 0, score_2 = 0, score_3 = 0;
    for(int i=0; i<answers.size(); i++)
    {
        if(answers[i] == answerPattern_1[idx_1++])
        {
            score_1++;
        }
        if(answers[i] == answerPattern_2[idx_2++])
        {
            score_2++;
        }
        if(answers[i] == answerPattern_3[idx_3++])
        {
            score_3++;
        }

        if(idx_1 == answerPattern_1.size())
            idx_1 = 0;
        if(idx_2 == answerPattern_2.size())
            idx_2 = 0;
        if(idx_3 == answerPattern_3.size())
            idx_3 = 0;
    }


    // 점수가 1명이 큰 경우 1,2,3
    // 점수가 2명이 큰 경우 1,2 / 1,3 / 2,3
    // 점수가 3명이 같은 경우 1,2,3
    if(score_1 == score_2 && score_1 == score_3 && score_2 == score_3)
    {
        answer.push_back(1);
        answer.push_back(2);
        answer.push_back(3);
        return answer;
    }

    if(score_1 >= score_2 && score_1 >= score_3)
    {
        answer.push_back(1);
        if(score_1== score_2)
            answer.push_back(2);
        if(score_1 == score_3)
            answer.push_back(3);
    }
    else if(score_2 >= score_1 && score_2 >= score_3)
    {
        answer.push_back(2);
        if(score_2 == score_1)
            answer.push_back(1);
        if(score_2 == score_3)
            answer.push_back(3);
    }
    else if(score_3 >= score_1 && score_3 >= score_2)
    {
        answer.push_back(3);
        if (score_3 == score_1)
            answer.push_back(1);
        if (score_3 == score_2)
            answer.push_back(2);  
    }

    sort(answer.begin(), answer.end()); // 오름차순 정렬

    return answer;
}

처음에 이렇게 풀고나서 '다른 사람 풀이 보기'가 있길래 한 번 봤는데
진짜 엄청 깔끔한 코드가 있어서 감탄했다..

그리고 포인트 몇 개를 잡아서 내 코드도 그에 맞춰 수정해보았다!

1. 점수 패턴 배열의 인덱스 관리

  • 각 수포자 삼인방은 점수 패턴이 있어서 그 패턴대로 돌려가며 채점을 하는데
    나는 인덱스 관리를 따로 해준다는 점이 아쉽게 느껴졌었다
  • 그러한 점에서 i % pattern.size() 로 인덱스를 관리해준다는 게 너무 놀라웠다
    이렇게 깔끔할 수 있다니?
    mod를 쓰면 0보다 크고 pattern.size()보다 작은 숫자만 나올 수 있다는 점을 잘 활용한 거 같다.

2. score 변수 대신 배열을 활용

  • 나는 수포자 삼인방의 score 변수를 각각 따로 만들었는데,
    배열 하나를 만들어서 관리한다는 점이 깔끔해서 좋은 거 같다.

3. max_element() 함수 사용

  • 처음 보는 함수인데 algorithm 라이브러리에 포함되어 있는 함수였다
  • 배열에서 가장 큰 원소를 찾기에 간편해서 좋다.

4. 3명의 점수 비교해서 answer 배열 만들기

  • 내 코드에서 가장 맘에 안드는 부분이기도 했다
  • 최고 점수를 찾은 다음, 점수 배열을 돌면서 같은 점수가 있다면
    그 사람을 answer 배열에 넣어주면 된다는 게 간단한 아이디어면서도 나는 생각해내지 못한 부분이라..
    기억할 점이라고 생각되었다.

다른 사람 코드 하나에 이렇게 배울 점이 많다니 놀랍기도 하고
여태 다른 사람 코드는 잘 안 본 내 자신도 놀랍고
앞으로는 자주 봐야겠다..!


Modified CODE

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> answerPattern_1 = {1, 2, 3, 4, 5};
    vector<int> answerPattern_2 = {2, 1, 2, 3, 2, 4, 2, 5};
    vector<int> answerPattern_3 = {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] == answerPattern_1[i % answerPattern_1.size()])
            score[0]++;
        if (answers[i] == answerPattern_2[i % answerPattern_2.size()])
            score[1]++;
        if (answers[i] == answerPattern_3[i % answerPattern_3.size()])
            score[2]++;
    }

    int max_score = *max_element(score.begin(), score.end());
    for(int i=0; i<3; i++)
    {
        if(max_score == score[i])
            answer.push_back(i+1);
    }

    return answer;
}
profile
Game Programmer

0개의 댓글