본문 바로가기

algorithm/middle

프로그래머스 사이트 캐시 문제

왜맞?

 

프로그래머스 완주하지 못한 선수(레벨 1) : https://programmers.co.kr/learn/courses/30/lessons/42576?language=cpp 

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

//https://programmers.co.kr/learn/courses/30/lessons/42576
 
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    sort(participant.begin(), participant.end());
    sort(completion.begin(), completion.end());
    while(!completion.empty()) {
        if(participant.back()==completion.back()) {
            participant.pop_back();
            completion.pop_back();
        }else{
            return participant.back();
        }
    }
    //return participant.back(); // 이 부분을 주석 제거해야 올바른 코드.
	//participant.push_back("test"); // 이 부분을 주석 제거하면 signal: aborted (core dumped)
}
C++ Clang++ 10.0 (C++17) clang++ -std=c++17 -O2 -Wno-unused-result -o FILENAME

해당 코드는 틀린 알고리즘 풀이이다. 하지만 프로그래머스 제출하면 정답이 뜬다;

participant 사이즈가 completion 사이즈보다 클 경우 리턴이 이루어 지지 않는 경우가 있기 때문이다.

ex) p = { "a", "b", "c", "d"}, c = {"b", "c", "d"}

 

프로그래머스가 사용하는 컴파일 옵션이 우리가 평소 사용하는 IDE와 달라서 그런지 캐시 문제가 발생한거 같다.

-> return이 없는데 컴파일 된 경우, 이전에 호출된 return register에 있는걸 그대로 사용하는 경우가 있는데, 그 경우가 우연히 맞아 떨어져서 명시적으로 리턴을 하지 않아도 정답 처리된것 같다.

 

마지막에 의미 없는 함수의 리턴값을 생성하면 signal: aborted (core dumped) 가 발생한다.

 

 

해당 내용을 프로그래머스에 이슈 제기했당