3 min read

[Level 1] 탑 - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅

Table of Contents

탑 문제 풀이

문제

문제 열어보기

μˆ˜ν‰ 직선에 탑 NλŒ€λ₯Ό μ„Έμ› μŠ΅λ‹ˆλ‹€. λͺ¨λ“  νƒ‘μ˜ κΌ­λŒ€κΈ°μ—λŠ” μ‹ ν˜Έλ₯Ό 솑/μˆ˜μ‹ ν•˜λŠ” μž₯치λ₯Ό μ„€μΉ˜ν–ˆμŠ΅λ‹ˆλ‹€. λ°œμ‚¬ν•œ μ‹ ν˜ΈλŠ” μ‹ ν˜Έλ₯Ό 보낸 탑보닀 높은 νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ ν•©λ‹ˆλ‹€. λ˜ν•œ, ν•œ 번 μˆ˜μ‹ λœ μ‹ ν˜ΈλŠ” λ‹€λ₯Έ νƒ‘μœΌλ‘œ μ†‘μ‹ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 높이가 6, 9, 5, 7, 4인 λ‹€μ„― 탑이 μ™Όμͺ½μœΌλ‘œ λ™μ‹œμ— λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό λ°œμ‚¬ν•©λ‹ˆλ‹€. 그러면, 탑은 λ‹€μŒκ³Ό 같이 μ‹ ν˜Έλ₯Ό μ£Όκ³ λ°›μŠ΅λ‹ˆλ‹€. 높이가 4인 λ‹€μ„― 번째 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ μ‹ ν˜ΈλŠ” 높이가 7인 λ„€ 번째 탑이 μˆ˜μ‹ ν•˜κ³ , 높이가 7인 λ„€ 번째 νƒ‘μ˜ μ‹ ν˜ΈλŠ” 높이가 9인 두 번째 탑이, 높이가 5인 μ„Έ 번째 νƒ‘μ˜ μ‹ ν˜Έλ„ 높이가 9인 두 번째 탑이 μˆ˜μ‹ ν•©λ‹ˆλ‹€. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 λ ˆμ΄μ € μ‹ ν˜ΈλŠ” μ–΄λ–€ νƒ‘μ—μ„œλ„ μˆ˜μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

솑신 탑(높이)μˆ˜μ‹  탑(높이)
5(4)4(7)
4(7)2(9)
3(5)2(9)
2(9)-
1(6)-

맨 μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ νƒ‘μ˜ 높이λ₯Ό 담은 λ°°μ—΄ heightsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ 각 탑이 쏜 μ‹ ν˜Έλ₯Ό μ–΄λŠ νƒ‘μ—μ„œ λ°›μ•˜λŠ”μ§€ κΈ°λ‘ν•œ 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • heightsλŠ” 길이 2 이상 100 μ΄ν•˜μΈ μ •μˆ˜ λ°°μ—΄μž…λ‹ˆλ‹€.
  • λͺ¨λ“  νƒ‘μ˜ λ†’μ΄λŠ” 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” 탑이 μ—†μœΌλ©΄ 0으둜 ν‘œμ‹œν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

heightsreturn
[6,9,5,7,4][0,0,2,2,4]
[3,9,9,3,5,7,2][0,0,0,3,3,3,6]
[1,5,3,6,7,6,5][0,0,2,0,0,5,6]

μž…μΆœλ ₯ 예 μ„€λͺ…

  • μž…μΆœλ ₯ 예 #1
    μ•žμ„œ μ„€λͺ…ν•œ μ˜ˆμ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • μž…μΆœλ ₯ 예 #2
    [1,2,3] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 아무도 μˆ˜μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    [4,5,6] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 3번째 탑이 μˆ˜μ‹ ν•©λ‹ˆλ‹€.
    [7] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 6번째 탑이 μˆ˜μ‹ ν•©λ‹ˆλ‹€.

  • μž…μΆœλ ₯ 예 #3
    [1,2,4,5] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 아무도 μˆ˜μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    [3] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 2번째 탑이 μˆ˜μ‹ ν•©λ‹ˆλ‹€.
    [6] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 5번째 탑이 μˆ˜μ‹ ν•©λ‹ˆλ‹€.
    [7] 번째 탑이 쏜 μ‹ ν˜ΈλŠ” 6번째 탑이 μˆ˜μ‹ ν•©λ‹ˆλ‹€.


풀이

function solution(heights) {
  let heightsLength = heights.length;
  let answer = Array(heightsLength).fill(0);

  for (let i = heightsLength - 1; i >= 0; i--) {
    for (let j = i - 1; j >= 0; j--) {
      if (heights[j] > heights[i]) {
        answer[i] = j + 1;
        break;
      }
    }
  }

  return answer;
}

λ’€μ—μ„œλΆ€ν„° μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©° μžμ‹ λ³΄λ‹€ 길이가 κΈ΄ 탑이 λ‚˜νƒ€λ‚¬μ„ λ•Œ ν•΄λ‹Ή νƒ‘μ˜ index + 1 을 μ²΄ν¬ν•΄μ£ΌλŠ” λ°©λ²•μœΌλ‘œ ν’€μ—ˆλ‹€. λ‚˜λŠ” 문제 κ·ΈλŒ€λ‘œ 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©° ν’€μ—ˆλŠ”λ°, λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό λ³΄λ‹ˆ ꡳ이 그럴 ν•„μš”κ°€ 없이 첫번째 λ°˜λ³΅μ—μ„œλŠ” μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½, λ‘λ²ˆμ§Έ λ°˜λ³΅μ—μ„œλ§Œ 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ 가도 λ˜κ² λ”λΌ.

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

function solution(heights) {
  return heights.map((v, i) => {
    while (i) {
      i--;
      if (heights[i] > v) {
        return i + 1;
      }
    }
    return 0;
  });
}