https://school.programmers.co.kr/learn/courses/30/lessons/64061
문제 접근
*개인적으로 푸는 맛이 있는 문제였음
인형 뽑기 게임의 구조가 2차원 배열로 구성되어 있어서 1번에 위치한 인형들을 계속해서 뽑으려면 [0][0] → [1][0] 이렇게 첫 번째 배열의 숫자를 바꾸어 주어야한다.
이중 for문 안에서 if(board[j][moves[i]-1] !=0) 조건으로 뽑을 번호가 0이 아닌 수를 찾아내서 bucket에 저장하고 뽑은 번호는 0으로 바꾸어주고 다음 뽑을 번호로 이동한다.
* 뽑으면서 실시간으로 같은 번호가 붙으면 없애주고 싶었는데 안떠올라서 번호를 다 뽑고 한 꺼 번에 제거하였음
번호를 다 뽑고 bukcet 리스트 안에서 수 들을 하나 씩 다 비교해서 제거
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
List<Integer> bucket = new ArrayList<Integer>();
for(int i = 0; i<moves.length; i++) {
for(int j=0; j<board.length; j++) {
if(board[j][moves[i]-1] != 0) {
bucket.add(board[j][moves[i]-1]);
board[j][moves[i]-1] = 0;
break;
}
}
}
for(int i=0; i<bucket.size()-1; i++) {
if(bucket.get(i) == bucket.get(i+1)) {
answer += 2;
bucket.remove(i);
bucket.remove(i);
i = -1;
}
}
return answer;
}
}
다른 사람 풀이
문제를 읽으면서 스택인가..? 라는 생각이 들었는데 역시나 다른 사람 풀이들은 스택을 많이 사용했더라
사용 방법은 List와 유사하며 Stack은 저장한 값이 하나씩 안쪽에 쌓이고 마지막에 들어간 값이 제일 먼저 나오는 선입선출(Last In First Out)구조이다.
자세한 건 https://coding-factory.tistory.com/601
풀이 방법은 내가 푼 거랑 같으며 stack, list의 사용차이이다.
isEmpty()는 값이 비어있을 경우
stack에서 값 저장은 push, 값 삭제는 pop, 제일 위에 값 출력은 peek이다.
import java.util.Stack;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int j = 0; j < board.length; j++) {
if (board[j][move - 1] != 0) {
if (stack.isEmpty()) {
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
if (board[j][move - 1] == stack.peek()) {
stack.pop();
answer += 2;
} else
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
}
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 체육복 / JAVA / 탐욕법] (1) | 2023.03.16 |
---|---|
[프로그래머스 / 실패율 / JAVA] (0) | 2023.03.15 |
[프로그래머스 / K번 째 수 / JAVA / 정렬] * Arrays.copyOfRange() (0) | 2023.03.10 |
[프로그래머스 / 모의고사 / JAVA / 완전탐색] (1) | 2023.03.10 |
[프로그래머스 / 키패드 누르기 / JAVA] (0) | 2023.03.08 |
댓글