739.Β Daily Temperatures

  • νŠΉμ • λ‚ μ§œ κ΅¬κ°„μ˜ 일별 μ˜¨λ„κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ 각 λ‚ μ§œ μ—΄ μ˜¨λ„λ‘œ λΆ€ν„° 처음으둜 더 높은 μ˜¨λ„κ°€ λ“±μž₯ν•˜λŠ” λ‚  κΉŒμ§€ λͺ‡μΌμ΄ κ±Έλ¦¬λŠ”μ§€ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
    • 예λ₯Ό λ“€μ–΄ [25, 23, 27, 21]의 경우 25 β†’ 27κΉŒμ§€ 2일, 23 β†’ 27κΉŒμ§€ 1일, 27의 경우 이후 더 μ˜¨λ„κ°€ 높은 날이 μ—†κ³ , 21은 λ§ˆμ§€λ§‰ λ‚ μ΄λ―€λ‘œ κ²°κ³ΌλŠ” [2, 1, 0, 0]이 λœλ‹€.
  • λ„ˆλ¬΄ μ–΄λ ΅κ²Œ μƒκ°ν•΄μ„œ λͺ» ν’€μ—ˆλŠ”λ° 힌트λ₯Ό λ³΄λ‹ˆκΉŒ κ°‘μžκΈ° 생각이 났닀.
    • 배열을 μ •λ°©ν–₯으둜 μˆœνšŒν•΄μ„œ ν’€λ €κ³  ν•˜λ‹ˆ μ–΄λ €μ› λ˜ 것 κ°™λ‹€.
  • 이 λ¬Έμ œλŠ” νŠΉμ • 일자λ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄λ‹Ή 일자 이후에 μžμ‹ λ³΄λ‹€ μ˜¨λ„κ°€ 높은 λ‚  쀑 κ°€μž₯ κ°€κΉŒμš΄ 날을 찾으면 λ˜λŠ” λ¬Έμ œμ΄λ‹€.
    • μ˜¨λ„μ˜ λ²”μœ„κ°€ 30 ~ 100μ΄λ―€λ‘œ 배열을 λ§Œλ“€μ–΄μ„œ 각 μ˜¨λ„κ°€ λ“±μž₯ν•œ 날을 λ°°μ—΄ indices 에 기둝할 수 μžˆλ‹€.
    • νŠΉμ •μΌ 이후에 각 μ˜¨λ„λ³„λ‘œ κ°€μž₯ κ·Όμ ‘ν•œ 날을 기둝해야 ν•˜λ―€λ‘œ μ˜¨λ„ temperature 배열을 μ—­μˆœμœΌλ‘œ μˆœνšŒν•˜λ©° κΈ°λ‘ν•˜λ©΄ λœλ‹€.
    • 각 μ˜¨λ„κ°€ λ“±μž₯ν•œ 날을 κΈ°λ‘ν•œ λ°°μ—΄ indices 을 μˆœνšŒν•˜λ©΄μ„œ ν˜„μž¬ μ˜¨λ„ 보닀 높은 μ˜¨λ„ 쀑 κ°€μž₯ κ·Όμ ‘ν•œ 날을 μ°ΎλŠ”λ‹€.
class Solution { final int MIN_TEMP = 30; final int MAX_TEMP = 100; public int[] dailyTemperatures(int[] temperatures) { int n = temperatures.length; int[] result = new int[n]; int[] indices = new int[MAX_TEMP - MIN_TEMP + 1]; for (int i = n - 1; i >= 0; --i) { int t = temperatures[i]; indices[t - MIN_TEMP] = i; int nextIndex = Integer.MAX_VALUE; for (int j = t + 1; j <= MAX_TEMP; ++j) { if (indices[j - MIN_TEMP] == 0) continue; nextIndex = Math.min(nextIndex, indices[j - MIN_TEMP]); } if (nextIndex != Integer.MAX_VALUE) { result[i] = nextIndex - i; } } return result; } }