프로그래머스/1레벨
크레인 인형뽑기 게임/C++
Koalitsiya
2022. 12. 30. 14:06
문제설명
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[제한사항]
- board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
- board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
- moves 배열의 크기는 1 이상 1,000 이하입니다.
- moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
풀이 방법
※주어진 라이브러리만 이용해서 풀기 위해 벡터를 스택처럼 사용하였습니다.
1. 2차원 배열 board의 y축 역할을 할 ySize를 선언
2. moves[i]번 위치에서 ySize만큼 반복해서 인형이 들어있는 위치를 찾습니다.
3-1. 바구니에 담을 때 바구니가 비어있지 않고 basket의 마지막 원소와 찾은 위치에 있는 원소가 같다면 마지막 원소와 담을 원소가 사라지므로 pop_back()을 하고 answer += 2를 해줍니다.
3-2. 위 조건에 만족하지 않는다면 basket에 원소를 담아줍니다.
4. moves[i]를 수행했으므로 다음으로 넘어가기 위해 break 해줍니다.
5. 모든 반복문이 끝나면 answer 리턴
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
int ySize = board.size();
vector<int> basket;
for(int i = 0; i < moves.size(); i++) {
int k = moves[i] - 1;
for(int j = 0; j < ySize; j++){
if(board[j][k] != 0) {
if(basket.empty() == false && basket.back() == board[j][k]){
basket.pop_back();
answer += 2;
}
else
basket.push_back(board[j][k]);
board[j][k] = 0;
break;
}
}
}
return answer;
}