-
[c++] kakao_winter_19_01(인형 뽑기)알고리즘/programmers 2020. 4. 16. 20:47
문제 분류 : stack
[문제 설명]
- vector<vector<int>> board 형식으로 받은 인형뽑기 기계 안의 인형들을 하나씩 moves 벡터의 순서대로 뽑아 오른쪽 바구니어 넣는 문제이다. 단, 같은 종류의 인형이 2개 쌓여있을 경우 그 인형들은 사라진다. 최종적으로 사라진 인형의 총 갯수를 구하는 문제이다.
[ISSUE 사항]
- vector 를 선언하면서 테스트 케이스들을 push_back 하지말고 한번에 선언할 수 없나?
=> 단순히 배열 선언하듯이 벡터의 요소들 같이 선언하면 됨
- board 로 받은 변수가 그림 그대로 처럼 가로 기준으로 나열된건데 난 괜히 세로로 이해해서 상당히 시간이 오래걸림
=> 문제를 꼼꼼히 읽자;
- for문 속 continue 와 break 의 용도를 헷갈림
=> for문 속에서 continue를 만나면 i가 하나 올라가고, break를 만나면 해당 for문이 종료된다.
- 각 요소를 한번에 선언하는 for문과의 만남
=> for(int num : moves) 는 moves 속의 각각의 요소를 차례대로 num 변수에 할당하는 의미이다.
[코드]
#include <iostream> #include <vector> #include <stack> #define endl "\n" using namespace std; vector<vector<int>> board = { {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} }; vector<int> moves = { 1,5,3,5,1,2,1,4 }; int solution(vector<vector<int>> board, vector<int> moves) { int answer = 0; stack<int>stk; int n = board.size(); for (int num : moves) { num -= 1; for (int i = 0; i < n; i++) { if (board[i][num] == 0) continue; // 바구니 스택에 어떤 값이 있고, 가장 위에 값이랑 board 에서 뽑은값이랑 같으면 // 바구니에서 뽑아버리고 2개가 없어졌으니 answer 에 2를 더해준다. if (!stk.empty() && stk.top() == board[i][num]) { stk.pop(); answer += 2; } else {//board 에서 어떤 값을 뽑았는데 바구니 윗값이랑 같지 않으면 걍 바구니에 넣어준다. stk.push(board[i][num]); } //board 값이 0이 아니라서 바로 위의 if랑 else 문 둘중 하나에 걸린거다 // 그럴경우 어쨋든 뽑힌거니까 그 자리를 0으로 만들어주고 // break 걸어서 moves 의 다음 순서로 진행한다. board[i][num] = 0; break; } } return answer; } int main() { cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false); cout<<solution(board, moves)<<endl; return 0; }
'알고리즘 > programmers' 카테고리의 다른 글
[C++] JadenCase (0) 2020.04.06