일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리눅스마스터 1급 정리
- 스프링 컨테이너
- 코테
- map
- 반복문
- toCharArray
- 명령어
- 카카오
- java 백준 1차원 배열
- 연습문제
- 자바스크립트 코딩의 기술
- 문자열
- 코딩테스트
- GoingBus
- JavaScript
- 스프링 빈
- 백준 java
- 개발자 회고록
- Kotlin
- 리눅스마스터1급
- 프로그래머스
- Linux
- 백준 javascript
- 리눅스
- 리눅스마스터 3과목
- Java
- 자바
- Memoir
- 월간코드챌린지
- 고잉버스
- Today
- Total
hoon's bLog
[Java] 프로그래머스 크레인 인형뽑기 게임 자바 본문
문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/64061
와.... 역대급 문제 이미지인 것 같다 ㅎㅎㅎ
한 컷으로 편집하려 했으나.... 역부족이었다....
역시 카카오는 다르다는 말밖에....ㅋㅋㅋㅋㅋㅋ
예시 사진이 동적으로 움직이는 정성까지 ㄷㄷ ㅋㅋㅋㅋㅋㅋ
문제길이에 난독증은 기분 탓인 건가
아무튼 문제풀이 Let's Go!!
[나의 풀이]
- 어떤 값들을 쌓는다는 개념에서 Stack을 착안!
- Stack 배열 boardStack[]에 입력 배열 board[][]를 다음과 같이 넣어준다!
board[4][4] | board[0][4] | |||
board[4][3] | ... | |||
board[4][2] | ... | |||
board[4][1] | ... | |||
board[4][0] | ... | |||
boardStack[0] | boardStack[1] | boardStack[2] | boardStack[3] | boardStack[4] |
- for 문을 통해 Stack배열로 화면을 구성하고, 그 배열에 순차적으로 board배열의 값을 넣어서 문제와 같이 Stack을 구성한다!
- Stack의 peak / push / pop 메서드를 통해 확인 / 입력 / 삭제 진행!
import java.util.Stack;
public class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack[] boardStack = new Stack[board.length]; //화면용 Stack 배열
Stack<Integer> basket = new Stack<Integer>(); //인형을 뽑아 담을 바구니 Stack
//화면용 stack배열 안에 stack 만들기
for(int i = 0; i < board.length; i++){
boardStack[i] = new Stack<Integer>();
}
//배열 index를 맞춰주기 위해 입력 배열(board)의 길이-1
for(int i = board.length-1; i >= 0; i--){
for(int j=0; j < board.length; j++){
if(board[i][j] != 0)
boardStack[j].push(board[i][j]);
}
}
for(int i = 0; i< moves.length; i++) {
// 이동은 최소 1이기에 -1로 index 조절
// 해당 stack 비어있으며 그대로 진행
if(boardStack[moves[i]-1].empty()) continue;
//boardStack 맨 위에서 나올 숫자
int popNo = (int) boardStack[moves[i]-1].pop();
if(basket.size() == 0) //빈 바구니에 최초 put
basket.push(popNo);
else{
if(popNo == basket.peek()){ //바구니에서 같은 인형인지 값 확인
answer += 2; //2개일 때 인형이 사라지므로 return값 +2
basket.pop(); //pop으로 해당값 삭제
}else{
basket.push(popNo); //아니면 그냥 push
}
}
}
return answer;
}
}
이 것이 카카오의 벽인 건가?ㄷㄷ
시간제한이 있었다면 이미 탈락 수준이다.....
그나마라도 생각난 게 다행이다...라고
자축했지만, "인턴십"!!! 무려 인턴십!!!
문제에 자책할 수밖에............
이 것도 설마 Stream으로 하진 않았겠지?
라는 조심스러운 마음으로 다른 사람들의 코드를 옅보면~~
[다른 사람의 풀이-1]
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;
}
}
[다른 사람의 풀이-2]
import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
List<Integer> nums = 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){
nums.add(board[j][moves[i]-1]);
board[j][moves[i]-1]=0;
break;
}
}
}
for(int k=0;k<nums.size();k++){
if(k!=(nums.size()-1)){
if(nums.get(k)==nums.get(k+1)){
nums.remove(k);
nums.remove(k);
answer++;
k=-1;
}
}
}
return answer*2;
}
}
[정리]
- 자료구조 관련 알고리즘엔 Collection Framework를 사용하는 게 효과적이다!
- Stack형 배열을 굳이 쓰지 않아도.... 방법은 늘 있다....
개인피셜 난이도 : ★★★☆☆
개인적으로 간만에 시간이 오래 걸렸다...
늘 반복문, 조건문, 배열, List로만 꼼지락 거리다가,
Stack이란 Collection Framework를 사용하려니 머리가 복잡했다...ㅠㅠ
계속해서 사고하는 능력을 멈추지 않고,
끊임없이, 꾸준히, 코딩 테스트 연습을 통해,
시간을 절약해보도록,
시간을 많이 투자해야겠다...?
오래 걸렸다고 좌절하지 말고,
끝까지 내 힘으로 풀어보자!
끝.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 숫자 문자열과 영단어 자바 (0) | 2022.06.19 |
---|---|
[Java] 프로그래머스 키패드 누르기 자바 (0) | 2022.06.18 |
[Java] 프로그래머스 폰켓몬 자바 (0) | 2022.06.16 |
Java 프로그래머스 예산 자바 (0) | 2022.06.15 |
[Java] 프로그래머스 소수 만들기 자바 (0) | 2022.06.14 |