πŸ’»μš©λ‡½ 개발 λ…ΈνŠΈπŸ’»
article thumbnail
λ°˜μ‘ν˜•

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 'κ²Œμž„ 맡 μ΅œλ‹¨κ±°λ¦¬' μžλ°”μŠ€ν¬λ¦½νŠΈ 문제 풀이 (LV.2)

문제 πŸ‘€

ROR κ²Œμž„은 λ‘ νŒ€μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ§„ν–‰ν•˜λ©°, μƒλŒ€ νŒ€ μ§„μ˜μ„ λ¨Όμ € νŒŒκ΄΄ν•˜λ©΄ μ΄κΈ°λŠ” κ²Œμž„μž…λ‹ˆλ‹€. λ”°λΌμ„œ, κ° νŒ€μ€ μƒλŒ€ νŒ€ μ§„μ˜μ— μ΅œλŒ€ν•œ λΉ¨λ¦¬ λ„μ°©ν•˜λŠ” κ²ƒμ΄ μœ λ¦¬ν•©λ‹ˆλ‹€.

μ§€κΈˆλΆ€ν„° λ‹Ήμ‹ μ€ ν•œ νŒ€μ˜ νŒ€μ›μ΄ λ˜μ–΄ κ²Œμž„을 μ§„ν–‰ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 5 x 5 ν¬κΈ°μ˜ λ§΅μ—, λ‹Ήμ‹ μ˜ μΊλ¦­ν„°κ°€ (ν–‰: 1, μ—΄: 1) μœ„μΉ˜μ— μžˆκ³ , μƒλŒ€ νŒ€ μ§„μ˜μ€ (ν–‰: 5, μ—΄: 5) μœ„μΉ˜μ— μžˆλŠ” κ²½μš°μ˜ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

문제 μ„€λͺ… 1

μœ„ κ·Έλ¦Όμ—μ„œ κ²€μ€μƒ‰ λΆ€λΆ„은 λ²½μœΌλ‘œ λ§‰ν˜€μžˆμ–΄ κ°ˆ μˆ˜ μ—†λŠ” κΈΈμ΄λ©°, ν°μƒ‰ λΆ€λΆ„은 κ°ˆ μˆ˜ μžˆλŠ” κΈΈμž…λ‹ˆλ‹€. μΊλ¦­ν„°κ°€ μ›€μ§μΌ λ•ŒλŠ” λ™, μ„œ, λ‚¨, λΆ λ°©ν–₯으둜 ν•œ μΉΈμ”© μ΄λ™ν•˜λ©°, κ²Œμž„ λ§΅μ„ λ²—μ–΄λ‚œ κΈΈμ€ κ°ˆ μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.
μ•„λž˜ μ˜ˆμ‹œλŠ” μΊλ¦­ν„°κ°€ μƒλŒ€ νŒ€ μ§„μ˜μœΌλ‘œ κ°€λŠ” λ‘ κ°€μ§€ λ°©λ²•μ„ λ‚˜νƒ€λ‚΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

첫 λ²ˆμ§Έ λ°©λ²•μ€ 11개의 μΉΈμ„ μ§€λ‚˜μ„œ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.

문제 μ„€λͺ… 2

두 λ²ˆμ§Έ λ°©λ²•μ€ 15개의 μΉΈμ„ μ§€λ‚˜μ„œ μƒλŒ€νŒ€ μ§„μ˜μ— λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.

문제 μ„€λͺ… 3

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” μ²« λ²ˆμ§Έ λ°©λ²•λ³΄λ‹€ λ” λΉ λ₯΄κ²Œ μƒλŒ€νŒ€ μ§„μ˜μ— λ„μ°©ν•˜λŠ” λ°©λ²•μ€ μ—†μœΌλ―€λ‘œ, μ΄ λ°©λ²•μ΄ μƒλŒ€ νŒ€ μ§„μ˜μœΌλ‘œ κ°€λŠ” κ°€μž₯ λΉ λ₯Έ λ°©λ²•μž…λ‹ˆλ‹€.

λ§Œμ•½, μƒλŒ€ νŒ€μ΄ μžμ‹ μ˜ νŒ€ μ§„μ˜ μ£Όμœ„에 λ²½μ„ μ„Έμ›Œλ‘μ—ˆλ‹€λ©΄ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό κ°™μ€ κ²½μš°μ— λ‹Ήμ‹ μ˜ μΊλ¦­ν„°λŠ” μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•  μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.

문제 μ„€λͺ… 4

κ²Œμž„ λ§΅μ˜ μƒνƒœ mapsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μΊλ¦­ν„°κ°€ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜κΈ° μœ„ν•΄μ„œ μ§€λ‚˜κ°€μ•Ό ν•˜λŠ” μΉΈμ˜ κ°œμˆ˜μ˜ μ΅œμ†Ÿκ°’을 return ν•˜λ„둝 solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”. λ‹¨, μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•  μˆ˜ μ—†μ„ λ•ŒλŠ” -1을 return ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

mapsλŠ” n x m ν¬κΈ°μ˜ κ²Œμž„ λ§΅μ˜ μƒνƒœκ°€ λ“€μ–΄μžˆλŠ” 2차원 λ°°μ—΄λ‘œ, nκ³Ό m은 κ°κ° 1 μ΄μƒ 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
nκ³Ό m은 μ„œλ‘œ κ°™μ„ μˆ˜λ„, λ‹€λ₯Ό μˆ˜λ„ μžˆμ§€λ§Œ, nκ³Ό m이 λͺ¨λ‘ 1인 κ²½μš°λŠ” μž…λ ₯으둜 μ£Όμ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
mapsλŠ” 0κ³Ό 1둜만 μ΄λ£¨μ–΄μ Έ μžˆμœΌλ©°, 0은 λ²½μ΄ μžˆλŠ” μžλ¦¬, 1은 λ²½μ΄ μ—†λŠ” μžλ¦¬λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
μ²˜μŒμ— μΊλ¦­ν„°λŠ” κ²Œμž„ λ§΅μ˜ μ’ŒμΈ‘ μƒλ‹¨μΈ (1, 1) μœ„μΉ˜μ— μžˆμœΌλ©°, μƒλŒ€λ°© μ§„μ˜μ€ κ²Œμž„ λ§΅μ˜ μš°μΈ‘ ν•˜λ‹¨μΈ (n, m) μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

maps answer
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

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

μž…μΆœλ ₯ μ˜ˆ #1
주어진 λ°μ΄ν„°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예제 1

캐릭터가 μ  νŒ€μ˜ μ§„μ˜κΉŒμ§€ μ΄λ™ν•˜λŠ” κ°€μž₯ λΉ λ₯Έ κΈΈμ€ λ‹€μŒ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예제 2

λ”°λΌμ„œ 총 11칸을 캐릭터가 μ§€λ‚˜κ°”μœΌλ―€λ‘œ 11을 return ν•˜λ©΄ λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆ #2
문제의 μ˜ˆμ‹œμ™€ κ°™μœΌλ©°, μƒλŒ€ νŒ€ μ§„μ˜μ— λ„달할 λ°©λ²•μ΄ μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ -1을 return ν•©λ‹ˆλ‹€.

λ°˜μ‘ν˜•

풀이 μ½”λ“œ πŸ’‘

class Queue {
  constructor() {
    this.items = {};
    this.headIndex = 0;
    this.tailIndex = 0;
  }

  enqueue(item) {
    this.items[this.tailIndex] = item;
    this.tailIndex++;
  }

  dequeue() {
    const item = this.items[this.headIndex];
    delete this.items[this.headIndex];
    this.headIndex++;
    return item;
  }

  peek() {
    return this.items[this.headIndex];
  }

  size() {
    return this.tailIndex - this.headIndex;
  }
}

function solution(maps) {
  const queue = new Queue();
  const [n, m] = [maps.length, maps[0].length];
  const [targetX, targetY] = [n - 1, m - 1];
  const dx = [-1, 1, 0, 0];
  const dy = [0, 0, -1, 1];
  queue.enqueue([0, 0, 1]);

  while (queue.size() !== 0) {
    const [x, y, cost] = queue.dequeue();
    if (x === targetX && y === targetY) {
      return cost;
    }

    for (let i = 0; i < 4; i++) {
      const nx = x + dx[i];
      const ny = y + dy[i];
      if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
      if (maps[nx][ny] === 1) {
        queue.enqueue([nx, ny, cost + 1]);
        maps[nx][ny] = 0;
      }
    }
  }

  return -1;
}

풀이 ν•΄μ„€ πŸ’‘

ν•΄λ‹Ή λ¬Έμ œλŠ” BFS μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν’€μ΄ν–ˆλ‹€.

λ¨Όμ € QueueλŠ” 배열을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  객체λ₯Ό ν™œμš©ν•œ Queue둜 ν’€μ΄ν–ˆλ‹€.

배열을 톡해 Queueλ₯Ό κ΅¬ν˜„ν•˜κ²Œ 되면 맨 μ•žμ— μš”μ†Œλ₯Ό μ‚½μž…, μ‚­μ œ ν˜Ήμ€ 쀑간에 μ‚½μž… μ‚­μ œ ν•˜λŠ” 경우 μ‹œκ°„ λ³΅μž‘λ„κ°€ O(N)이 되고 객체λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•˜λ©΄ Queue에 λŒ€ν•œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)둜 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— QueueλŠ” λ”°λ‘œ λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.

 

이 λ¬Έμ œλŠ” BFS만 기본적으둜 λ‹€λ£° 수 있으면 μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆλŠ” 문제라고 μƒκ°ν•œλ‹€.

 

λ¨Όμ €, queueμ—λŠ” 처음 캐릭터가 μ‹œμž‘ν•˜λŠ” μœ„μΉ˜μ™€ μ΄λ™ν•œ 거리가 queue둜 λ“€μ–΄κ°€κ²Œ λœλ‹€.

 

λ‹€μŒμœΌλ‘œ while문을 ν†΅ν•΄μ„œ queue에 아무것도 없을 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•˜κ²Œ λœλ‹€.

whileλ¬Έ μ•ˆμ—μ„œλŠ” queue의 처음 μš”μ†Œλ₯Ό κΊΌλ‚΄μ€€ 뒀에 κΊΌλ‚Έ μš”μ†Œμ˜ μœ„μΉ˜κ°€ λͺ©ν‘œ μœ„μΉ˜μ™€ κ°™λ‹€λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ˜ 거리λ₯Ό return ν•œλ‹€.

 

아직 λͺ©ν‘œ μœ„μΉ˜κ°€ μ•„λ‹ˆλΌλ©΄ κΊΌλ‚Έ μœ„μΉ˜λ‘œλΆ€ν„° 동, μ„œ, 남, 뢁을 νƒμƒ‰ν•˜κ²Œ λœλ‹€.

κΊΌλ‚Έ μœ„μΉ˜λ‘œλΆ€ν„° 갈 μˆ˜κ°€ μ—†λŠ” 곳이면 λ‹€μŒ λ°©ν–₯으둜 λ‹€μ‹œ νƒμƒ‰ν•œλ‹€. (continue)

그리고 이동할 μœ„μΉ˜κ°€ 벽이 μ—†λŠ” 곳이라면 queue에닀가 이동할 μœ„μΉ˜μ™€ 거리(λΉ„μš©)λ₯Ό λ„£μ–΄μ€€λ‹€.

λ„£μ–΄μ€€ λ’€μ—λŠ” λ°©λ¬Έ 처리λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ λ°©λ¬Έν•œ 곳은 벽이 μžˆλŠ” κ²ƒμ²˜λŸΌ 0으둜 λ°”κΏ”μ€€λ‹€.

 

μ΄λ ‡κ²Œ BFS 탐색을 ν•˜λ©΄μ„œ λͺ©ν‘œμ§€μ μ— λ„λ‹¬ν•˜μ§€ λͺ»ν•˜κ³  끝났닀면 -1을 return ν•˜κ²Œ λœλ‹€.

채점 κ²°κ³Ό βœ…

채점 κ²°κ³Ό

 

λ°˜μ‘ν˜•
profile

πŸ’»μš©λ‡½ 개발 λ…ΈνŠΈπŸ’»

@μš©λ‡½

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!