막무가내로 삽질하는 알고리즘

DailyTemperature

Jungsoomin :) 2020. 10. 11. 14:56

해당 날에서 더 따듯한 날이 며칠 후에 찾아오는지 알아보는 문제이다. 각 배열의 인덱스를 날짜로 보고 차이를 빼서 답을 도출하려했다.

  • for문이 돌때 temp에 i번쨰 원소를 저장 하고 내부 for문 실행
  • 내부 for 문의 j번째 원소가 temp보다 값이 크다면 j - i (인덱스로 날짜 계산)
  • 값이 없을 경우를 고려해 아니라면 0 으로 주고 continue
public class DailyTemperature {
    public static void main(String[] args) {
        int[] T = new int[]{73,74,75,71,69,72,76,73};
        int[] answer = solve(T);

        System.out.println(Arrays.toString(answer));
    }

    private static int[] solve(int[] t) {
        int[] answer = new int[t.length];
        for(int i=0; i<t.length; i++){
            int temp = t[i];
            for(int j = i+1; j<t.length-1; j++){
                if(t[j] > temp){
                    answer[i] = j - i;
                    break;
                } else {
                    answer[i] = 0;
                    continue;
                }
            }
        }
    return answer;
    }
}

역시나 풀이는 달랐다. 이런 알고리즘의 경우 방법은 스택을 생각하는 것이라고 한다.

  • 루프마다 스택에 인덱스를 저장 
  • while 문 조건 : 스택이 비어있지 않거나, peek() 맨위 값을 확인 한 원소가 루프중인 원소보다 작을때 
  • 더 따뜻한 날을 찾았을 때에 stack 에서 pop() 을 해서 저장해놨던 인덱스와 루프 값을 뺴서 날짜 계산
  • while 을 선택한 이유는 stack의 깊이를 고려하고, 보다 따뜻한 날들을 모두 계산값에 포함시키기 위해
  • int[] 의 초기 값은 0 이므로 미래시점은 0
public class DailyTemperatureTeaching {
    public static void main(String[] args) {
        int[] T = new int[]{73, 74, 75, 71, 69, 72, 76, 73};
        int[] res = dailytemperatures(T);

        System.out.println("result ===============");
        for (int i : res) {
            System.out.print(i + " ");
        }
    }

    private static int[] dailytemperatures(int[] t) {
        //1 그릇은 스택이다.
        Stack<Integer> stack = new Stack<>();
        int[] result = new int[t.length];

        //2 빼내기
        for (int i = 0; i < t.length; i++) {
            // stack에 값이 있고 peek 한 값의 원소가 i 원소보다 작을때
            while (!stack.isEmpty() && t[stack.peek()] < t[i]) {
                int index = stack.pop();// 스택에 인덱스가 들어있다.
                //result[0] = 1 - 0 ;
                result[index] = i - index;
            }

            stack.push(i);//인덱스를 담음
        }
        return result;
    }
}

'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글

우선순위 큐  (0) 2020.10.18
Merge Interval  (0) 2020.10.11
TwoSum  (0) 2020.10.11
MoveZeros  (0) 2020.10.04
Meeting Room1  (0) 2020.10.04