자바 초급문제로 맨땅에 해딩하기

자바 초급문제 10. 크레인인형뽑기게임

Jungsoomin :) 2020. 4. 3. 03:14

프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/64061)

자바 초급 문제의 2019카카오개발자 겨울인턴십_크레인인형뽑기게임 이다.

 

문제의 내용에서 각자 달리 이해할 점이 있고 부딪쳐보는 과정에서 그 것이 큰 성장을 준 것 같아 직접 보고 본인 만의 로직을 짜보시는 것을 권해드리고 싶다.

밖에 나가서도 카페에서도 집에서도 온통 이 문제에 대한 생각 뿐이었다.

 

코드가 발전하는 것이 느껴진다. 부끄러운 말일지도 모르겠지만..,아무리 작은 것이라도 놓치고 싶지 않아지고, 변수를 선언할 때에도 전보다 가벼히 여기지 않는다.

맹목적으로 코드를 짜내려가는 것이 아니라 생각하고 짠다. 생각을 하며 짠다.  이렇게 조금씩 발전할 수 있다는 점 하나만으로도 나를 행복하게 해주기는 충분한 것 같다.

 

주석 부분에 출력으로 디버깅을 했고, 배열의 출력 값을 맞추는데 성공했다. 하지만 더 좋은 코드들이 분명히 있어보였다. 이렇게 난잡히 코드를 짜내려간 것은 내가 변수 선언에 대한 코드의 정렬성을 크게 간과하고 있다는 것을 알게해주었다. 그리고 공간배열의 상상 속에서도 절대로 바뀌지않는 하나의 불변하는 변수를 선언하는 것과 그에 있어서 변동하는 값이라도 불변의 변수가 될 수 있다는 점을 깨닫게 해주었다. 즉 키워드가 있는 것을 느꼈다.

 

어떻게 내가 이 문제를 감사히 여기지 않을 수가 있을까, 그럴 수는 절대로 없다. 손으로 코드를 쓰고 그를 하나하나 써내려가며 로직의 움직임을 이해하는 치열한 과정 속에서 나도 모르게 내가 보는 관점이 조금 더 확장되었다는 것을 풀고서 코드 리뷰를 천천히 하고서야 알았다. 물론 많은 시간을 쓴 것은 사실이지만 만족하고 감사한다. 그리고 자신에 대해 더 부끄러워할 줄 아는 사람이 되었다. '더 많은 것을 배우고 쌓아가리라.' 하는 마음이 잔잔히 파도친다. 마음이 조금씩 떨리는 듯도 하다.

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class subClass {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        int count = 0;
        int[] myDoll = new int[moves.length]; // 인형(숫자)를 뽑은 배열임<<초기화 안되어 있음, 오류 일으킴 myDoll 에 무사히 대입시키는 방법을 찾아야함.
 
        for (int cat = 0; cat < moves.length; cat++) {
            for (int i = 0; i < board.length; i++) {
                if (!(board[i][moves[count] - 1== 0)) {
                    myDoll[count] = board[i][moves[count] - 1];
                    board[i][moves[count] - 1= 0;
                    count++;
                    break;
                } else if (board[board.length - 1][moves[count] - 1== 0) {
                    myDoll[count] = 0;
                    count++;
                    break;
                }
            }
        }   
        // System.out.println(myDoll[6]);<테스트용
        // 여기까지가 뽑아서 쌓는과정 {4,3,1,1,3,2,0,4}이 나와야함
        // {4,3,1,1,3,2,0}이 출력됨, 마지막 뽑기에 문제가 있는 것.
 
        int firstNumber = 0;
 
        firstNumber = myDoll[0];
        for (int i = 1; i < myDoll.length; i++) {
            if (!(myDoll[i] == 0)) {
                if (myDoll[i] == firstNumber) {
                    firstNumber = myDoll[i];
                    myDoll[i] = 0;
                    myDoll[i - 1= 0;
                    answer += 2;
                } else {
                    firstNumber = myDoll[i];
                }
            }
        }
 
        return answer;
 
    }
}
 
cs

   

 

 

리뷰 후 짠 코드이다. 위의 코드보다 코드의 간결성과 변수 선언에 있어서 더 신중하다는 것을 알 수 있다.

불변하는 변수는 변동할 수도 있다. 특히 집게가 내려가는 for문. 불변 변수는 x좌표 값의 식 이다.

x,y좌표 값으로 접근하고 집게의 위치는 인덱스의 위치에 고정되어 있다는 점. 그 식을 변수로 삼을 수 있다면 코드는 더욱 간결하고 편안해질 수 있다는 점.  행과 열의 2차원 배열에서 좌표계로 움직이면 더욱 쉽게 인덱스 값을 파악할 수 있다는 점. 틀을 잡아야 흔들리지않을 수 있다. 그래야 로직을 바꾼다고 해도 근간이 흔들리지않는 것이다.

오늘도 정말 큰 배움을 얻었고, 이 코드는 다시 한 번 리뷰한대로 다시 짜내려갈 것이다. '기본, 만드는 작업보다 설계가 더 중요하는 점, 개발자의 능력은 자료구조를 얼마나알고 어떻게 적용할 수 있는가에 큰 영향력이 있구나'는 것도 은은하게 깨닫게 되었던 문제이다.

 

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
31
32
33
34
import java.util.*;
 
public class subClass01 {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        int check = 0;
        Stack<Integer> stack = new Stack<>();
        stack.push(300);
        // System.out.println(stack.peek());
        for (int i = 0; i < moves.length; i++) {
            int catch_x = moves[i] - 1;// x값 찾은것
            for (int j = 0; j < board.length; j++) {
                check = board[j][catch_x];
                if (check != 0) {
                    check = board[j][catch_x];
                    board[j][catch_x] = 0;
                    break;
                }
            }
            if (stack.peek() == check) {
                stack.pop();
                answer += 2;
 
            } else {
                if (check != 0) {
                    stack.push(check);
                }
 
            }
        }
 
        return answer;
    }
}
cs

 

1.public Element push(Element item); // 데이터 추가

2.public Element pop(); // 최근에 추가된(Top) 데이터 삭제

3.public Element peek(); // 최근에 추가된(Top) 데이터 조회

4.public boolean empty(); // stack의 값이 비었는지 확인, 비었으면 true, 아니면 false

5.public int seach(Object o); // 인자값으로 받은 데이터의 위치 반환

 

가장 핵심인 Stack 클래스이다. new 연산자로 접근할 수 있다. import 해야한다는 점도 내용도 메서드도 꼭 기억해두자.

 

-밑은 이클립스 단축키이다.

cntl+a = 전체 선택

cntl + shift + f = 줄 정렬

 

이 문제를 풀면서 "나도 풀면 카카오 인턴십에 들어가는거야!!"하고 즐거워했다. 물론 시간은 한참이나 걸렸고, 그럴 일도 없을테지만 말이다. 얼마나 코드를 짜면서 즐거워했는지..주변에서 웃으며 무슨 합격이냐고 장난스레 웃는 것을 들으며 즐겁게 코드를 타이핑하고 짜내려갔다.

 

즐거운 문제고 나를 더 성장시켜준 좋은 문제이다.

오늘의 일은 잊기 힘들 것 같다.

 

정말로 잊기가 힘들 것 같은 문제이다.