프로그래머스 (코딩테스트연습) - 크레인 인형뽑기
해당 문제는 스택에 뽑은 번호를 넣어두고, 번호를 뽑을 때 마다 해당 스택의 peek값과 비교해 같다면 pop을 하고 answer 값을 1씩 더해주었고, 같지 않다면 스택에 계속 쌓는 식으로 구현하였다. move 좌표의 높이를 알고 있다면 바로 이중 배열에서 가져갈 수 있을 거라 생각해 board 각 좌표의 높이를 구한 후에 스택 로직을 수행했었는데,
public int solution(int[][] board, int[] moves) {
int answer = 0;
int N = board.length;
int[] boardXHeight = new int[N];
Stack<Integer> barket = new Stack<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] > 0) {
boardXHeight[j]++;
}
}
}
for (int moveX : moves) {
int xHeight = boardXHeight[moveX - 1]--;
if (xHeight > 0) {
int pick = board[N - xHeight][moveX - 1];
if (!barket.isEmpty() && barket.peek() == pick) {
barket.pop();
answer++;
} else {
barket.push(pick);
}
board[N - xHeight][moveX - 1] = 0;
}
}
return answer * 2;
}
스택에 넣고 peek값과 비교하는 로직은 같지만 그외 뽑은 인형을 구하는 건 아래 방식이 더 효율적으로 보인다.
public int solution2(int[][] board, int[] moves) {
int answer = 0;
int N = board.length;
Stack<Integer> barket = new Stack<>();
for (int moveX : moves) {
for (int floor = 0; floor < N; floor++) {
int pick = board[floor][moveX - 1];
if (pick > 0) {
if (!barket.isEmpty() && barket.peek() == pick) {
barket.pop();
answer++;
} else {
barket.push(pick);
}
board[floor][moveX - 1] = 0;
break;
}
}
}
return answer * 2;
}
'정리 > 알고리즘' 카테고리의 다른 글
프로그래머스 - 오픈채팅방 (0) | 2022.03.31 |
---|---|
프로그래머스 - 문자열압축 (0) | 2022.03.30 |
프로그래머스 - 키패드 누르기 (0) | 2022.03.25 |
프로그래머스 - 숫자 문자열과 영단어 (0) | 2022.03.24 |
프로그래머스 - 신규 아이디 추천 (0) | 2022.03.23 |
댓글