https://programmers.co.kr/learn/courses/30/lessons/42576
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
1) 풀이
요즘 프로그래머스를 열심히 푸는 중인데,
이것도 이 형식에 적응하다보니 좀 풀만한 것 같기도 하고...
그치만 백준을 너무 오래도록 풀어서 아직까지 어색한 감은 있다..
아무튼, 위 문제는 단순히 생각하면 오히려 쉽게 풀리는 문제이다.
처음에는 참여자 배열의 값들을 반복문으로 하나씩 find함수에 넣고,
해당 값이 completion 배열에 있는지를 확인해주었다.
find() 함수에서 completion.end() 를 가르키면, 해당 participant 값을 answer에 넣는 형식으로..
당연히 테스트 케이스는 전부 통과됐지만, 이 방법은 효율적인 면에서 빵점을 맞았다😂
그래서 진짜 단순하게 participant와 completion을 sort 함수로 정렬해주고,
각각의 배열의 동일한 인덱스에 들어있는 값을 비교하여 값이 다르거나,
completion 배열의 사이즈를 넘어선 경우(completion 배열의 값이 하나 덜 들어있다)
해당 participant 배열의 값을 answer에 넣어주는 방식으로 수정했다!
이렇게 해서 테스트 케이스를 돌리는데, 분명 논리적으로 맞는데도 계속해서 마지막 tc가 값이 틀리더라...
이유는, 내가 몽총하게도 answer에 답을 넣는 과정에서 break 를 해주지 않아,
다음 인덱스로 넘어가 answer의 답을 계속 바꾸게 두었던 것...!
처음으로 answer에 값이 들어갈 때 break 해주지 않으면,
completion의 값이 하나 적기 때문에 완주를 했음에도..
인덱스로 비교하기 때문에 ..값이 다르다고 나온다,,!
그래서 answer의 값을 갈아치우기 때문에 break는 필수!
2) 최종 소스코드
#include <string>
#include <vector>
#include <iostream>
#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());
for(int i=0;i<participant.size();i++){
if(i>=completion.size()||participant[i]!=completion[i]){ //completion 크기를 넘어가거나, 비교해서 값이 다를때
answer=participant[i];
break;
}
}
return answer;
}
3) 참고자료
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스/c++] 짝지어 제거하기 (0) | 2021.06.18 |
---|---|
[프로그래머스/c++] 폰켓몬 (0) | 2021.06.16 |
[프로그래머스/c++] 게임 맵 최단거리 (0) | 2021.06.13 |
[프로그래머스/c++] 체육복 (0) | 2021.06.03 |
[프로그래머스/JavaScript] 3진법 뒤집기 (0) | 2021.05.20 |