코딩테스트/프로그래머스

[프로그래머스] 명예의 전당(1)

쪼르뚜 2023. 10. 26. 20:33
728x90
반응형

문제

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

 

프로그래머스

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

programmers.co.kr

풀이와 코드

풀고 보니 9, 11번 케이스가 통과가 안돼서 반례를 찾아보니 k가 score.size()보다 크거나 같은 경우가 있었다.

그래서 예외로 추가하니 코드가 엄청 길고 지저분하게 되어버린 느낌...

다른 사람의 풀이를 좀 보니 10줄 이내로 작성된 답도 있었다;

auto와 for문을 같이 사용한 답이었는데 조금씩 C++ 문법도 익숙해질 수 있도록 공부 열심히 해야쥐.

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

using namespace std;

vector<int> solution(int k, vector<int> score) {
    vector<int> answer;
    vector<int> hallOfFame;
    int minScore = score[0];
    
    if (k >= score.size()){
        for(int i=0; i<score.size(); i++){
            if (minScore > score[i]){
                answer.push_back(score[i]);
                minScore = score[i];
            }else{
                answer.push_back(minScore);
            }
        }
        
        return answer;
    }
    
    // 명예의 전당 초기 세팅
    for(int i=0; i<k; i++){
        hallOfFame.push_back(score[i]);
        
        if (minScore > score[i]){
            answer.push_back(score[i]);
            minScore = score[i];
        }else{
            answer.push_back(minScore);
        }
    }
    
    for(int j=k; j<score.size(); j++){
        if (score[j] > minScore){
            int min = *min_element(hallOfFame.begin(), hallOfFame.end());
            int minIndex = min_element(hallOfFame.begin(), hallOfFame.end()) - hallOfFame.begin();
            
            hallOfFame.erase(hallOfFame.begin() + minIndex);
            hallOfFame.push_back(score[j]);
            
            int newMin = *min_element(hallOfFame.begin(), hallOfFame.end());
            answer.push_back(newMin);
            minScore = newMin;
        }else{
            answer.push_back(minScore);
        }
    }

    return answer;
}
728x90
반응형