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