Coding Test/programmers
[프로그래머스] 크레인 인형뽑기 c++
owls
2022. 8. 18. 23:26
728x90
문제 설명
n행마다 인형이 쌓여져 있다.
인형은 moves 원소로 표현된다.
주어진 moves와 board에 따라 쌓여져 있는 맨 위의 원소를 꺼내 새로운 저장소에 담는다.
이 때, 같은 인형 번호가 2개가 만나면 2개는 사라진다.
사라진 인형의 개수를 구하는 문제이다.
제한 사항
- board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
- board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
- moves 배열의 크기는 1 이상 1,000 이하입니다.
- moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
입출력 예
board | moves | result |
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] | [1,5,3,5,1,2,1,4] | 4 |
풀이
인형을 순차적으로 꺼내기 위해서 index의 시작이 0부터 인지 n 부터인지 나와있지 않아 헷갈렸다.
그림과 board 벡터의 원소들을 매칭해보았다.
이렇게 해보니 어떤 룰인지 이해가 갔다.
baord[0]이 맨 아래 행으로 생각했는데 아니였다. board[0]이 맨 위에 위치해서 제일 먼저 인형이 꺼내지는 곳이다.
또한, 표를 그려서 board와 moves에 따라 인형뽑기 룰을 이해했다.
마지막 결과 표와 아래 결과 그림이 같다는 것을 확인 할 수 있다.
위에 표를 코드화하면 아래와 같이 구현할 수 있습니다.
#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++){
int check = moves[i] - 1;
for(int j = 0; j < board.size(); j++){
if(board[j][check] != 0){
if(!s.empty() && s.top() == board[j][check]){
s.pop();
answer += 2;
}
else{
s.push(board[j][check]);
}
board[j][check] = 0;
break;
}
}
}
return answer;
}
728x90