https://programmers.co.kr/learn/courses/30/lessons/64061
스택에 쌓으면서 하나씩 확인해가면서 같은 숫자면 터트리고 터진 인형의 갯수 +=2 해주는걸로 가자!
//테스트코드
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class Quiz1_CraneDrawingDollsGameTest {
Quiz1_CraneDrawingDollsGame q;
@BeforeEach
void setUp() {
q = new Quiz1_CraneDrawingDollsGame();
}
@Test
void test1() {
assertEquals(4, q.solution(new int[][]{{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}}, new int[]{1, 5, 3, 5, 1, 2, 1, 4}));
}
}
//프로덕션코드
import java.util.Stack;
public class Quiz1_CraneDrawingDollsGame {
public int solution(int[][] board, int[] moves) {
int numberOfPopingDolls = 0;
int lastNumber = -1;
int newNumber;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int i = 0; i < board.length; i++) {
newNumber = board[i][move - 1];
if (newNumber == 0) {
continue;
}
if (newNumber == lastNumber) {
stack.pop();
numberOfPopingDolls += 2;
if (stack.size() != 0) {
lastNumber = stack.peek();
} else {
lastNumber = -1;
}
board[i][move - 1] = 0;
break;
}
stack.push(newNumber);
lastNumber = newNumber;
board[i][move - 1] = 0;
break;
}
}
return numberOfPopingDolls;
}
}
// 성공! 사실 이 문제는 풀다가 에러가 많이 났다. continue; break; 를 효율적으로 사용하지 못했다.
// 그리고 인형을 뺐으면 그 자리는 0으로 바꿔줘야하는데 그것까지 생각하지 못했다.
// 문제를 더 유심히 보고 확실히 풀이 과정을 생각한 뒤에 코드 작성을 시작하자! 오히려 더 빠르다!
// 그리고 이 문제는 들여쓰기가 많았는데 디버그 과정에서 내 스스로 보기가 어려워서 중간에 리팩토링을 진행했다.
// 더 깔끔히 할 수 있는지 확인하고 리팩토링하고 마무리하자.
// 프로덕션코드
import java.util.Stack;
public class Quiz1_CraneDrawingDollsGame {
public int solution(int[][] board, int[] moves) {
int numberOfPopingDolls = 0;
int lastNumber = -1;
int newNumber;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int i = 0; i < board.length; i++) {
newNumber = board[i][move - 1];
if (newNumber == 0) {
continue;
}
if (newNumber == lastNumber) {
stack.pop();
numberOfPopingDolls += 2;
lastNumber = setLastNumber(stack);
setAZeroAtTheZoneAfterDollIsOut(board, move, i);
break;
}
stack.push(newNumber);
lastNumber = newNumber;
setAZeroAtTheZoneAfterDollIsOut(board, move, i);
break;
}
}
return numberOfPopingDolls;
}
private void setAZeroAtTheZoneAfterDollIsOut(int[][] board, int move, int i) {
board[i][move - 1] = 0;
}
private int setLastNumber(Stack<Integer> stack) {
int lastNumber;
if (stack.size() != 0) {
lastNumber = stack.peek();
} else {
lastNumber = -1;
}
return lastNumber;
}
}
// 성공!
'코딩테스트연습 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 - JAVA] 카카오프렌즈 컬러링북 (0) | 2021.12.17 |
---|---|
[프로그래머스 - JAVA] 문자열 내 마음대로 정렬하기 (0) | 2021.12.16 |
[프로그래머스 - JAVA] 같은 숫자는 싫어 (1) | 2021.12.13 |
[프로그래머스 - JAVA] 이상한 문자 만들기 (0) | 2021.12.12 |
[프로그래머스 - JAVA] 시저 암호 (0) | 2021.12.08 |