๐Ÿ’ป TIL 2023.02.06

๊น€์˜์šฐ(Yeongwoo Kim)ยท2023๋…„ 2์›” 6์ผ
0
post-thumbnail

1. ํ˜ธํ…” ๋Œ€์‹ค(level 2)

- ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/155651

- ์ฝ”๋“œ ์ž‘์„ฑ ์ „ ์ƒ๊ฐ

  1. ์ž…๋ ฅ์ด ๊ณ„์‚ฐํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•จ.
    • ํ‡ด์‹ค์‹œ๊ฐ„์ด ํ•˜๋ฃจ๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‹œ๊ฐ„์„ ๋ถ„์œผ๋กœ ๋ฐ”๊ฟ”์„œ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. (ex : 10์‹œ 30๋ถ„ => 10 * 6 + 30 = 630๋ถ„, ํ‡ด์‹ค์‹œ๊ฐ„์€ ํ•ด๋‹น ๋กœ์ง์— ์ฒญ์†Œ์‹œ๊ฐ„๊นŒ์ง€ + 10์„ ํ•ด์ฃผ๋Š” ์‹์œผ๋กœ)
  2. ๋ฐฉ ๊ฐœ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ •ํ• ๊นŒ๋ฅผ ์ƒ๊ฐํ•˜๋˜ ์ค‘ 1๋ฒˆ ๊ณผ์ •์„ ํ†ตํ•ด ๋ฐ”๋€ ๋ฐฐ์—ด์„ ์˜ˆ์•ฝ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค, ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ๋งŒ๋“ค์–ด ๋†“๊ณ  (๋‹ค์Œ ์˜ˆ์•ฝ์ž์˜ ์‹œ์ž‘์‹œ๊ฐ„ - ํ˜„์žฌ ์ด์šฉ์ž์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„ >= 0) ์ด๋ฉด ๋ฐฉ์„ ๊ณ„์† ์“ฐ๋ฉด์„œ ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

- ๊ตฌํ˜„ ์ค‘ ์ถ”๊ฐ€ ๋œ ํ•ญ๋ชฉ

  1. ์ด๋ฏธ ๋ฐฉ์„ ๋ฐฐ์ •๋ฐ›์€ ์‚ฌ๋žŒ์ด์ง€ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋ฅผ ํ•ด์•ผํ• ๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ํ•„์š”ํ–ˆ๋‹ค.
     if (newBookTime[i].length === 3) {
       continue;
     }
     room += 1;
     newBookTime[i].push(true);
    • ํ•ด๋‹น ๋ฐฉ์‹๊ณผ ๊ฐ™์ด newBookTime[i] (i๋ฒˆ์งธ ์˜ˆ์•ฝ์ž์˜ ์‹œ๊ฐ„์ด ๋ณด๊ด€๋˜์–ด์žˆ์Œ)์— true๋ฅผ ๋„ฃ์–ด์คŒ์œผ๋กœ์„œ ํ•ด๋‹น ์ด์šฉ์ž๋Š” ๋ฐฉ์„ ๋ฐฐ์ •๋ฐ›์•˜๋‹ค๊ณ  ํ‘œ์‹œ๋ฅผ ํ–ˆ๋‹ค.

- ์ฝ”๋“œ

const toMinute = (array) => {
  return array
    .map((time) =>
      time.map((value, index) => {
        const times = value.split(":");
        if (index === 0) {
          return 60 * Number(times[0]) + Number(times[1]);
        }
        return 60 * Number(times[0]) + Number(times[1]) + 10;
      })
    )
    .sort((a, b) => a[0] - b[0]);
};

const solution = (book_time) => {
  const newBookTime = toMinute(book_time);
  let room = 0;
  for (let i = 0; i < newBookTime.length; i += 1) {
    if (newBookTime[i].length === 3) {
      continue;
    }
    room += 1;
    newBookTime[i].push(true);
    let end = newBookTime[i][1];
    let j = i + 1;
    while (j < newBookTime.length) {
      if (i === newBookTime.length - 1) {
        break;
      }
      if (newBookTime[j][0] - end >= 0 && newBookTime[j].length !== 3) {
        newBookTime[j].push(true);
        end = newBookTime[j][1];
      }
      j += 1;
    }
  }
  return room;
};

2. ๋งˆ๋ฒ•์˜ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ(level 2)

- ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/148653#

- ์ฝ”๋“œ ์ž‘์„ฑ ์ „ ์ƒ๊ฐ

  1. DFS๋ฅผ ํ†ตํ•œ ์žฌ๊ท€๋กœ ํ’€๋ฉด ๋ ๊ฒƒ ๊ฐ™๋‹ค.
  2. ์ตœ๋Œ€ ๊ฐฏ์ˆ˜๊ฐ€ 100,000,000์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœ๊ตฌํ˜„์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค.

- ๊ตฌํ˜„ ์ค‘ ์ถ”๊ฐ€ ๋œ ํ•ญ๋ชฉ

  1. ๋‹จ์ˆœํ•˜๊ฒŒ ์ผ์˜์ž๋ฆฌ ์ˆซ์ž๊ฐ€ 5๋ณด๋‹ค ์ž‘์„๋•Œ, ํด๋•Œ, 5์™€ ๊ฐ™์„๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
  2. 5๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ ๋‚ด๋ฆผ, 5๋ณด๋‹ค ํด ๊ฒฝ์šฐ ์˜ฌ๋ฆผ, 5์™€ ๊ฐ™์„ ๊ฒฝ์šฐ 10์˜ ์ž๋ฆฌ์ˆ˜๊ฐ€ 5๋ฏธ๋งŒ์ด๋ฉด ๋‚ด๋ฆผ 5์ด์ƒ์ด๋ฉด ์˜ฌ๋ฆผ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

- ์ฝ”๋“œ

const solution = (storey) => {
  let answer = 0;
  while (storey) {
    let cur = storey % 10;
    let next = Math.floor(storey / 10) % 10;
    if (cur > 5) {
      answer += 10 - cur;
      storey += 10;
    } else if (cur == 5) {
      answer += 5;
      storey += next >= 5 ? 10 : 0;
    } else answer += cur;
    storey = Math.floor(storey / 10);
  }
  return answer;
};

3. ์ˆซ์ž ํƒ€์ž ๋Œ€ํšŒ(level 3)

- ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/136797

- ์ฝ”๋“œ ์ž‘์„ฑ ์ „ ์ƒ๊ฐ

  1. ๋ธŒ๋ฃจํƒˆ ํฌ์Šค๋กœ ํ•ด๋ณผ๊นŒ ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ 2^100000์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์˜ˆ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  2. ํ•œ๋ฒˆ DP๋กœ ํ’€์–ด๋ณด๋ ค๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ดค๋‹ค.
  3. DP๋กœ ํ’€๊ธฐ ์œ„ํ•ด์„  3์ฐจ์› ๋ฐฐ์—ด์ด ํ•„์š”ํ–ˆ๋‹ค(n๋ฒˆ์งธ ์ˆซ์ž, ์™ผ์†, ์˜ค๋ฅธ์†)
  4. ์ ํ™”์‹์„ ์ƒ๊ฐํ•˜๋Š”๋ฐ๋Š” ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๋‹ค.
    DP[n][l][r] = Math.min(DP[n-1][k][r], DP[n-1][l][k])

- ๊ตฌํ˜„ ์ค‘ ์ถ”๊ฐ€ ๋œ ํ•ญ๋ชฉ

  1. DP[0][4][6] = 0 ์ด์—ฌ์•ผํ•œ๋‹ค. ๋งจ์ฒ˜์Œ 4,6์— ๊ฐ ์™ผ์† ์˜ค๋ฅธ์†์ด ์˜ฌ๋ ค์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  2. ๊ฐ€์ค‘์น˜์— ๊ด€ํ•œ ๋ฐฐ์—ด์ด ์žˆ์–ด์•ผํ•œ๋‹ค.(์ฝ”๋“œ๋กœ ์งœ๋ฉด ์ข‹์•˜๊ฒ ์ง€๋งŒ,,, ์ƒ๊ฐํ•  ํž˜์ด ์—†์–ด ๊ทธ๋ƒฅ ๋…ธ๊ฐ€๋‹ค๋กœ ์ผ๋‹ค.)
  3. js์˜ flat ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 2์ฐจ์›๋ฐฐ์—ด์„ 1์ฐจ์›์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„ ๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.(ex : a = [1,2,3,4,[5,6]] => a.flat() = [1,2,3,4,5,6]
  4. ์˜ค๋ฅ˜๋ฅผ ์ฐพ๋‹ค๊ฐ€ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ๋ˆ„๋ฅผ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๋Š”๊ฒƒ์„ ๊นŒ๋จน๊ณ  ์žˆ์—ˆ๋‹ค.
    if (i === j || prevValue === Infinity) continue;
    • i === j ์ฆ‰ ์™ผ์†๊ณผ ์˜ค๋ฅธ์†์ด ๊ฒน์น  ๊ฒฝ์šฐ, dp[n-1][i][j]๊ฐ€ infinity๋ผ๋ฉด ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์— continue๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

- ์ฝ”๋“œ

const weights = [
  [1, 7, 6, 7, 5, 4, 5, 3, 2, 3],
  [7, 1, 2, 4, 2, 3, 5, 4, 5, 6],
  [6, 2, 1, 2, 3, 2, 3, 5, 4, 5],
  [7, 4, 2, 1, 5, 3, 2, 6, 5, 4],
  [5, 2, 3, 5, 1, 2, 4, 2, 3, 5],
  [4, 3, 2, 3, 2, 1, 2, 3, 2, 3],
  [5, 5, 3, 2, 4, 2, 1, 5, 3, 2],
  [3, 4, 5, 6, 2, 3, 5, 1, 2, 4],
  [2, 5, 4, 5, 3, 2, 3, 2, 1, 2],
  [3, 6, 5, 4, 5, 3, 2, 4, 2, 1],
];

const solution = (numbers) => {
  const DP = Array.from({ length: numbers.length + 1 }, () =>
    Array.from({ length: 10 }, () => new Array(10).fill(Infinity))
  );

  DP[0][4][6] = 0;

  for (let idx = 0; idx < numbers.length; idx += 1) {
    const num = numbers[idx];

    const prevDP = DP[idx];
    const nowDP = DP[idx + 1];

    for (let i = 0; i < 10; i += 1) {
      for (let j = 0; j < 10; j += 1) {
        const prevValue = prevDP[i][j];
        if (i === j || prevValue === Infinity) continue;
        
        if (nowDP[num][j] > prevValue + weights[i][num]) {
            nowDP[num][j] = prevValue + weights[i][num]
        }
          
        if (nowDP[i][num] > prevValue + weights[num][j]) {
            nowDP[i][num] = prevValue + weights[num][j]
        }
      }
    }
  }

  return Math.min(...DP[numbers.length].flat(2));
};
profile
์ฐจ๊ทผ์ฐจ๊ทผ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€