1. 크레인 인형뽑기 (프로그래머스)
by BFine반응형
가. 문제파악
1. 유형 : Stack & 구현
- level1 문제인데 오랜만에 해서 그런지 시간도 오래걸리고 놓치는 부분이 많이있었다.
- 무턱대고 코드부터 작성하다보면 수정의 늪에 빠지기 쉽다...
나. 코드
1. 풀이 : Stack을 세로로 구현
- 통과는 했지만 좋은 풀이 방법은 아닌 것 같다.
- 최대 30까지 가능해서 세로 한줄당 하나의 스택으로해서 풀었다.
public int solution(int[][] board, int[] moves) {
int answer = 0;
int n = board.length;
Stack<Integer>[] stacks = new Stack[n];
Stack<Integer> result = new Stack<>();
for (int i = 0; i < stacks.length; i++) {
stacks[i] = new Stack<>();
}
for (int i = 0; i < n; i++) {
for(int j = n-1; j >=0; j--){
// 거꾸로 push 해야함
if(board[j][i] != 0){
stacks[i].push(board[j][i]);
}
}
}
for (int i = 0; i < moves.length; i++) {
if(!stacks[moves[i]-1].isEmpty()){
try {
if(result.isEmpty()){
result.add(stacks[moves[i]-1].pop());
continue;
}
if(result.peek() == stacks[moves[i]-1].peek()){
stacks[moves[i]-1].pop();
result.pop();
answer++;
}else{
result.add(stacks[moves[i]-1].pop());
}
}catch (Exception e){
}
}
}
return answer*2;
}
2. 풀이 : 배열을 활용하자!
- 위의 풀이의 문제는 최대치가 컷다면 메모리 문제가 발생할 것이다.
- 단순히 배열을 탐색해서 풀자, 해당라인을 세로로 쭉 탐색해서 풀면 간단하다.
public int solution(int[][] board, int[] moves) {
int answer = 0;
int n = board.length;
Stack<Integer> result = new Stack<>();
for (int i = 0; i < moves.length; i++) {
int location = moves[i]-1;
for (int k = 0; k < board.length; k++) {
if(board[k][location] != 0){
if(result.isEmpty()){
result.add(board[k][location]);
board[k][location] = 0;
break; // 아래 peek()의 exception 방지
}
if(result.peek() == board[k][location]){
result.pop();
answer++;
}else{
result.add(board[k][location]);
}
board[k][location] = 0;
break;
}
}
}
return answer*2;
}
}
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
6. 삼각달팽이 (프로그래머스) (0) | 2021.04.10 |
---|---|
5. 가장 큰 수 (프로그래머스) (0) | 2021.04.07 |
4. 소수찾기 (프로그래머스) (0) | 2021.04.04 |
3. 124 나라의 숫자 (프로그래머스) (0) | 2021.04.03 |
2. 신규아이디 추천 (프로그래머스) (0) | 2021.04.02 |
블로그의 정보
57개월 BackEnd
BFine