풀이과정
moves횟수만큼 반복문을 돌려주고 moves가 해당하는 열에 0이 아닌 것이 있으면
인형이 있다는 뜻이므로 스택에 push를 해준다. 만약 stack이 비어있지 않고
top이 넣는 인형과 같으면 두 개씩 터지는 것이므로 2를 답에 더해준다.
여기서 가장 중요한 부분은 break인데
0이 아닌 것을 찾았으면 한 번 실행만 하고 다음 move로 넘어가야 된다.
풀이1
#include <string>
#include <vector>
#include <stack>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
stack<int> s;
for(int i = 0; i < moves.size(); i++){
for(int j = 0; j < board.size(); j++){
if(board[j][moves[i] - 1] != 0) {
if(!s.empty() && s.top() == board[j][moves[i] - 1]){
s.pop();
answer += 2;
}
else s.push(board[j][moves[i] - 1]);
board[j][moves[i] - 1] = 0;
break;
}
}
}
return answer;
}
풀이2
#include <string>
#include <vector>
#define STACK_SIZE 1001
using namespace std;
// 스택 구현
int top = -1;
int st[STACK_SIZE];
bool IsEmpty(){
if(top < 0) return true;
else return false;
}
void push(int n){
st[++top] = n;
}
void pop(){
if(!IsEmpty()) st[top--];
}
int peek(){
if(!IsEmpty()) return st[top];
}
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
for(int i = 0; i < moves.size(); i++){
for(int j = 0; j < board.size(); j++){
if(board[j][moves[i] - 1] != 0) {
if(!IsEmpty() && peek() == board[j][moves[i] - 1]){
pop();
answer += 2;
}
else push(board[j][moves[i] - 1]);
board[j][moves[i] - 1] = 0;
break;
}
}
}
return answer;
}
'🍞 Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스][Level2] 2개 이하로 다른 비트 c++ (0) | 2022.10.20 |
---|---|
[프로그래머스][Level2] 2 x n 타일링 c++ (0) | 2022.10.20 |
[프로그래머스][Level1] 신규 아이디 추천 c++ (0) | 2022.09.03 |
[프로그래머스][Level1] 신고 결과 받기 c++ (0) | 2022.09.03 |
[프로그래머스][Level1] 문자열 내 마음대로 정렬하기 c++ (0) | 2022.09.03 |