문제
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
입력받은 배열 중 같은 숫자를 제외하고 출력하기
풀이
입력받은 배열 중 직전(마지막) 요소와 비교해야 하므로,
선입선출 방식의 자료구조인 큐를 이용한 풀이 방식이 가장 먼저 떠올랐다.
CODE 1 - 큐
큐에 숫자를 넣을지 말지 생각할 때는 (중복 체크 시에는)
if문을 통해 queue.back() 이 지금 입력할 숫자와 같은지 확인하면 된다.
다만, queue.size() == 0인 경우에는 비교 시 런타임 에러가 나므로,
이 경우도 함께 큐에 숫자를 push한다.
오답

아무리 봐도 맞는데 오답이 나와서 꼼꼼히 살펴봤는데,
for문에 q.size()를 그대로 써서 그랬다..
q.pop()을 할 경우 q.size()가 계속 작아지므로 q.size()를 그대로 쓰면 안되고,
변수에 저장해서 사용해야 한다.
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
vector<int> solution(vector<int> arr)
{
vector<int> answer;
queue<int> q; // 후입선출
for (auto a : arr){
if (q.empty() == true || !q.empty() && (q.back() != a)){
// 직전 입력 숫자가 현재 입력하려는 숫자와 동일한지 체크
q.push(a);
}
}
int qSize = q.size();
for (int i = 0; i < qSize; i++){
// 큐의 앞 부분부터 정답 배열에 push
answer.push_back(q.front());
q.pop();
}
return answer;
}
풀이 2
대개 스택과 큐 문제는 두 가지 방식으로 모두 풀 수 있는 경우가 많다.
이 문제도 후입선출 자료구조인 스택으로 충분히 풀 수 있어서, 스택으로도 풀어봤다.
CODE 2 - 스택
이번에는 스택으로 풀어 보면서, 다른 사람들 풀이를 통해 코드 개선점을 체크했다.
#include <vector>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
vector<int> solution(vector<int> arr)
{
vector<int> answer;
stack<int> stacks;
for (auto num: arr){
if (answer.empty() || stacks.top() != num){
stacks.push(num);
answer.push_back(num);
}
}
return answer;
}
CODE 3 - 배열
계속 코드에 대해서 고민하다가 깨달은건데,
굳이 stack이나 queue 없이도 간단하게 풀 수 있다...!
#include <vector>
#include <iostream>
#include <stack>
using namespace std;
vector<int> solution(vector<int> arr)
{
vector<int> answer;
for (auto a : arr){
if (answer.empty() || a != answer.back())
answer.push_back(a);
}
return answer;
}
회고
자료구조 중 제일 쉽다고 할 수 있는 스택과 큐 문제는
back() 과 front(), pop()에 대해서 헷갈릴 수 있으므로
완벽하게 이해하고 풀어야 한다.
이런 문제는 고민하면 고민할 수록 코딩적 게슈탈트 붕괴가 와서
내가 알고 있는게 팩트인지 잘못된 정보인지조차 헷갈리게 되기 때문에..
평소에 개념에 대해서 잘 알고 있는게 중요하다.
'PS > 프로그래머스' 카테고리의 다른 글
| [PS] 기능개발 (2) | 2025.06.30 |
|---|---|
| [PS] 올바른 괄호 (1) | 2025.06.29 |
| [PS] 의상 (0) | 2025.06.24 |
| [PS] 전화번호 목록 (1) | 2025.06.24 |
| [PS] 폰켓몬 (0) | 2025.06.23 |