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

자바 Level 2 문제, 1. 주식가격 진행 중

Jungsoomin :) 2020. 4. 15. 22:59

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

자바 Level 2 문제의 주식가격이다.

 

거창하게 Level 2라고 했지만 ..

스스로 더 상승했다기 보다는...차근차근 밟아나가는 과정의 내 모습이라.. Level 2라고 해도 문제를 접하시는 분 마다 다른 난이도를 체감하시리라 생각하며 겸손한 마음을 깊이 품고 있다.

사실 스스로 되돌아 볼때에 보기에 편하기 위해서 제목에 레벨을 구분해놓은 것으로, 부디 넓은 마음으로 이해해주시길 부탁드려본다.

 

아직 다 완성하지 못했고 로직에서의 빈틈이 꽤 발견되는 상황이다. 처음에는 간단하게 접근했으나, 제출과정에서 실패를 보고서 "second 변수를 어떻게 증감시킬까..테스트 예외 빼고는 또 어떤 변수가 나타날까.."하면서 다시 코딩을 해내려가기 시작했다. 로직에서 어떤 점이 변수인지 생각해보게 되는 듯 하다. 실제로 테스트 예외도 추가시켜보면서 다시 차근차근 접근해보고 있는 상태이다. 이미 코딩 문제를 푸는 과정에서 많은 시행착오를 겪고 있고 레벨을 하나 올린상태여서 더 많이 경험하고 찾아보고 싶은 마음이 큰 상태이다.

 

지금 다시보기에도 빈틈이 다수 생길 것 같아보여서 부딪치고 깨져보면서 경험해봐야 할 듯 하다. :)

 

 

 

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
package programmers_주식가격;
 
public class subClass2 {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        int check = 0;
 
        int second = 0;// 변수간 거리는 second
 
        for (int i = 0; i < prices.length; i++) {
            second = 0;
            if (i < prices.length - 1 && prices[i] > prices[i + 1]) {// << 실행예외발생지점
                second = 1;
                answer[i] = second;// 경우1 로직
                break;// <
            } else if (i == prices.length - 1) {// 다음 수가 없을경우
                second = 0;// 간격은 0
                answer[i] = second;// 경우2 로직
                break;// <
            } else {// 그 외의 경우는 다음수가 크거나 작아서 종료점 까지의 거리계산을 해야줘야하는 경우이다.
                try {
                    for (int j = i + 1; j < prices.length; j++) {// 비교 할 수
                        if (prices[i] > prices[j]) {
                            second = j - i;
                            break;// <
                        } // 멈출 부분을 확인하게된다면 j-i가 거리값이 되고
                    }
                    answer[i] = second;// 거리 대입해주고
                } catch (ArrayIndexOutOfBoundsException e) {// 실행예외는 마지막 수일때만 나옴
                    answer[i] = 0;
                    break;// <
                }
            } // <<20~33 라인 로직 다시 짜줘야함, 가정 변수는 확인했는데 평소의 거리계산 로직이 0으로 찍힘
        } // 바깥 for 문 종료
 
        for (int i = 0; i < answer.length; i++) {
            System.out.println(answer[i]);
        }
 
        return answer;
    }
}
 
cs

여기까지가 지금까지 한 진행과정이다. 33라인의 주석에서 기본적인 second 변수 증가가 잘 이루어지지 않는 상태이다. 이 로직을 해결하고 다음 결과를 봐야할 듯 하다.

 

 

 

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
package programmers_주식가격;
 
public class subClass {
    public int[] solution(int[] prices) {
        int[] answer = {};
        // 초단위로 기록된 주식가격이 담긴 배열 prices가 주어짐
        // 가격이 떨어지지 않는 기간이 몇초인지 확인하여 answer로 리턴
        // prices = 1,2,3,2,3 answer = 4,3,1,1,0
        // answer 의 길이는 prices 의 길이
        int count = 0;
        answer = new int[prices.length];
 
        for (int i = 0; i < prices.length; i++) {// 기준은 prices[i]
            count = 0;// 다시 비교할떄마다 다시 0으로 초기화.
            for (int j = i + 1; j < prices.length; j++) {// 비교할 숫자들은 나머지 인덱스들
                try {
                    if (prices[i] <= prices[j]) {
                        answer[i] += 1;// 넣어줌
                    } else if (prices[i] > prices[i + 1]) {// 바로 앞 수가 더 크면 끊어버린다. 그런데 어레이 인덱스 아웃오브 바운드 엑셉션이 날 수 도 있다.
                                                            // <<여기서 문제가 나고 있음.
                        answer[i] = 1;
                        break;// <
                    } else {
                        break;// << 여기서 문제가 생김.
                    }
                } catch (ArrayIndexOutOfBoundsException e) {// 예외가 발생할 경우는 딱 2가지임 i+1 이 인덱스 범위를 초과했을떄 즉 i의 숫자가 마지막 인덱스
                                                            // 갑실떄
                    // 다음 수가 없으므로 count 는 0로 잡아주고
                    answer[i] = 0;// 0대입
                }
 
            } // <여기까지 안 쪽 for 문 종료
        }
 
        for (int i = 0; i < answer.length; i++) {
            System.out.println(answer[i]);
        }
 
        return answer;
    }
}
 
cs

이전까지 쓰던 코드이다. 여기서 테스트는 통과했지만 제출과정에서 실패를 겪게되어서 second는 인덱스사이의 간격이라는 점과 경우의 수에 따라서 다른 값을 가질 수 있다라는 것을 느껴서 클래스를 다시 열어 코드를 작성하기 시작했다.