티스토리 뷰

728x90

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

C++

문제 유형은.. 시뮬레이션..?

프로그래머스 코딩테스트 연습 level1 문제이다.

카카오 2019 겨울 인턴십 코테 문제

이런 배열이 매개변수로 주어지고 (인형들은 인형의 고유 번호로 표시)

뽑기 크레인이 한번의 움직임 마다 멈추는 열번호 배열(moves)이 주어진다.

무조건 인형이 뽑힌다고 가정하고 뽑은 인형은 오른쪽의 박스에 넣어지는데 같은 인형이 연속으로 들어오면 터진다.

이때 터지는 인형의 개수를 구하는 문제이다.

 

풀이

우선 가장 바깥 반복문은 moves 배열을 탐색한다.

바로 안의 반복분은 인형을 만날때 까지 반복한다.

인형을 만났을때 벡터가 비어있거나, 벡터의 마지막 요소(맨위의 인형)과 지금 뽑은 인형이 같지 않으면

그 인형 번호를 내가 뽑은 인형들이 저장되는 벡터에 push한다. 

벡터의 마지막 요소(맨위의 인형)과 지금 뽑은 인형이 같으면 push하지 않고 pop 하고 answer값에 2을 더한다.

그 후에 뽑은 인형 위치의 값은 0으로 변경하고, 반복문을 나와서 다음 move로 이동하여 뽑기를 계속한다.

 

오답노트

처음에 뽑은 인형자리의 값을 0으로 바꿔주는 것과 인형을 만난 후에는 break를 하는 것을 처리하지 않아서 틀렸었다.

재밌다.

 

소스코드

#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
    int answer = 0;
    vector<int> box;
    for(int i = 0 ; i < moves.size(); i++){
        int col = moves[i]-1;
        for(int j = 0 ; j < board.size() ; j++){
            int here = board[j][col];
            if(here != 0){
                if(box.empty() || box.back() != here){
                    box.push_back(here);
                }else{
                    box.pop_back();
                    answer += 2;
                }
                board[j][col]=0;
                break;
            }
        }
    }
    return answer;
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함