[고득점Kit][완전 탐색] 모의고사 ⭐

Date:     Updated:

카테고리:

태그:

[완전 탐색] 모의고사

난이도 ⭐

문제

image


내 풀이 ⭕

통과된 풀이긴 했지만 좀 아쉽다! 더 간단하게 할 수 있었는데 😢

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

using namespace std;

bool compare(pair<int, int> a, pair<int, int> b) 
{
	return a.second > b.second;
}

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<pair<int,int>> temp{make_pair(0, 0), make_pair(1, 0), make_pair(2, 0)};
    
    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};
    
    for(int i = 0; i < answers.size(); i++)
    {
        if (i >= one.size())
        {
            if (answers[i] == one[i % one.size()])
                temp[0].second++;
        }
        else
        {
            if (answers[i] == one[i])
                temp[0].second++;
        }
    }
    
    for(int i = 0; i < answers.size(); i++)
    {
        if (i >= two.size())
        {
            if (answers[i] == two[i % two.size()])
                temp[1].second++;
        }
        else
        {
            if (answers[i] == two[i])
                temp[1].second++;
        }
    }
    
    for(int i = 0; i < answers.size(); i++)
    {
        if (i >= three.size())
        {
            if (answers[i] == three[i % three.size()])
                temp[2].second++;
        }
        else
        {
            if (answers[i] == three[i])
                temp[2].second++;
        }
    }
    
    sort(temp.begin(), temp.end(), compare);
    
    
    for(int i = 0; i < 3; i++)
    {
        if (i >= 1 && temp[i - 1].second != temp[i].second)
            break;
        answer.push_back(temp[i].first + 1);
    }
    
    return answer;
}


아쉬운 점

  • 수포자 1,2,3명의 답을 채점할 때 for문을 3 번씩 따로따로 돌릴 필요가 없었다.
    • 하나의 for문으로 처리 가능
  • if (i >= one.size()) else 이렇게 나눌 필요가 없었다.
    • 어차피 i < one.size() 이면 i % two.size()i가 되기 때문에
      • 2 % 10 = 2
  • 최대값을 구하기 위해 정렬을 했고 정렬 전에 인덱스를 기억하기 위해 pair 원소를 담는 temp 벡터를 선언하고 사용했었는데
    • max_element 함수를 사용하면 그냥 간단하게 정렬할 필요 없이 최대값을 구할 수 있었다!
      • STL알고리즘 헤더에 있는 max_element 함수 유용하니 꼭 기억하기!
        • 최대값 원소가 위치한 반복자를 리턴하니 *을 사용하여 간접참조 하기
  • vector <int> 는 사이즈만 지정 해주면 초기화 하지 않아도 전부 0으로 초기화가 된다.
    • vector<int> temp{0, 0, 0}도 괜찮지만 vector<int> temp(3)


보완

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

using namespace std;


vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> temp(3);

    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};
    
    for(int i = 0; i < answers.size(); i++)
    {
        if (answers[i] == one[i % one.size()]) temp[0]++;
        if (answers[i] == two[i % two.size()]) temp[1]++;
        if (answers[i] == three[i % three.size()]) temp[2]++;
    }
    
    int max = *max_element(temp.begin(), temp.end());
    
    for(int i = 0; i < 3; i++)
    {
        if (temp[i] == max)
            answer.push_back(i + 1);
    }
    
    return answer;
}


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기