문제
https://programmers.co.kr/learn/courses/30/lessons/64061
코딩테스트 연습 - 크레인 인형뽑기 게임
[[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
programmers.co.kr
풀이
알고리즘이 따로 필요한 문제는 아니었고 그냥 단순 구현 문제로 풀 수 있었다.
우선 매개변수 board를 전역으로 사용하는 것이 편해서 map이라는 변수에 Copy 해줬고, moves의 모든 원소들에 1을 빼주어 인형을 뽑아주었다. (Pick 함수, 인덱스는 0부터 시작하는데 Line의 값들은 1 ~ 5이기 때문)
가장 중요한 Pick 함수를 보면 입력받은 매개변수 Line을 통해 그 라인을 하나하나 내려가다 0이 아닌(인형인) 값을 찾아내면 stack(인형 바구니)에 push 해주고 인형을 빼준 다음(그 위치의 값을 0으로 만듬) for문을 탈출해 주었다. 하지만 인형 바구니가 비어있지 않고, 뽑은 인형이 바구니의 맨 위 인형과 일치하면 인형을 터트리는 조건을 추가해서 문제를 해결할 수 있었다.
이 문제를 풀면서 주의할 점은 stack(인형 바구니)가 비어있는데 stack의 top을 참조하려 하면 안 되기 때문에 바구니가 비어있지 않을 때만 top을 참조할 수 있도록 조건을 꼭 걸어두도록 한다.
코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
using namespace std;
int bombCnt = 0;
stack<int> basket;
vector<vector<int>> map;
void pick(int line)
{
for (int i = 0; i < map.size(); i++)
{
if (map[i][line] != 0)
{
if (!basket.empty())
{
if (basket.top() == map[i][line])
{
bombCnt++;
basket.pop();
map[i][line] = 0;
break;
}
}
basket.push(map[i][line]);
map[i][line] = 0;
break;
}
}
}
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
// copy
map.assign(board.size(), vector<int>(board.size()));
copy(board.begin(), board.end(), map.begin());
// pick
for (int i = 0; i < moves.size(); i++)
{
pick(moves[i] - 1);
}
answer = bombCnt * 2;
return answer;
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 프로그래머스 Level3 멀리 뛰기 C++ (0) | 2022.05.03 |
---|---|
[프로그래머스] 프로그래머스 Level3 2 x n 타일링 C++ (0) | 2022.05.03 |
[프로그래머스] 프로그래머스 Level2 게임 맵 최단거리 C++ (0) | 2022.05.02 |
[프로그래머스] 프로그래머스 Level1 로또의 최고 순위와 최저 순위 C++ (데브매칭 코딩테스트) (0) | 2022.05.02 |
[프로그래머스] 프로그래머스 Level1 소수 만들기 C++ (0) | 2022.05.01 |