vector<int> v
v.size() //vector의 크기반환
v.front() //첫번째 원소
v.back() //마지막 원소
v.push_back(x) /마지막 원소애 x삽입
v.pop_back() //마지막 원소 제거
v.erase(iterator) //iterrator가 가리키는 원소 삭제
v.empty() //v가 비어있으면 1,비어있지 않으면 0반환
cout<< v[i] //v의 i번째 원소 출력
stack<int> s; //선입후출
s.push(x) //top에 원소x추가
s.pop() //top의 원소 삭제
s.top() //스택의 가장 위의 원소 반환
s.empty() //비어있으면 true반환
s.size() //사이즈 반환
queue<int> q; //선입선출
q.push(x) //큐의 뒤에 원소 추가
q.pop() //큐의 앞에 있는 원소 삭제
q.front() // 큐의 제일 앞 원소 반환
q.back() // 큐의 제일 뒤원소 반환
s.empty() //비어있으면 true반환
s.size() //사이즈 반환
https://programmers.co.kr/learn/courses/30/lessons/64061
인형들이 배열로 표현되어 있으며 주어진 moves에 따라 stack에 쌓여지며 연속으로 같은 종류의 인형이 쌓이면 없어진다. 이때 없어지는 인형의 수를 return 하는 문제이다.
레벨1의 문제들은 배열을 요구사항에 맞게 순회하고 대소비교나 사칙연산 등을 해나가는 게 대부분의 흐름인 듯하다. 그리고 스택,큐,맵등의 자료구조의 기본적 활용을 하는 문제도 있는 것 같다.
#include <string>
#include <vector>
#include <iostream>
#include <stack>
using namespace std;
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
stack<int> s;
//moves는 1부터이므로 모든값 1씩 빼기
for(int i=0;i<moves.size();i++){
moves[i]--;
}
s.push(0);
for(int i=0;i<moves.size();i++){
for(int j=0;j< board.size();j++){
if(board[j][moves[i]]!=0){
if(board[j][moves[i]]==s.top()){
answer=answer+2;
board[j][moves[i]]=0;
s.pop();
break;
}
else{
s.push(board[j][moves[i]]);
board[j][moves[i]]=0;
break;
}
}
}
}
return answer;
}
나는 위와 같이 풀었다. 풀어놓고 보니 가장 안쪽의 if()else문에서 공통되는 부분은 빼놓는게 더 나은 코드일 것 같다.
문제를 푸는 포인트는 우선 문제를 정확히 이해하고, 배열의idx를 헷갈리지 않고 올바르게 순회하며 moves에 대응되는 값을 스택에 집어넣을 생각을 하는 것이 중요점으로 느껴진다.
스택 안의 값들을 모두 다 쌓은 후에 중복값이 있는지 검사하려면 복잡해졌다. 앞으로도 스택이나 큐 같이 인덱스로 바로 접근할 수 없는 자료구조는 원소를 넣는 과정에서 다른 검사나 연산을 같이 해야겠다.
당분간 레벨1 정도의 문제들을 풀어보면서 자료구조의 기본적 활용, 요구사항 대로 데이터를 순회하고 연산하는 것을 연습해야겠다.