๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ์—ฌํ–‰๊ฒฝ๋กœ

๐Ÿ“‹ ๋ฌธ์ œ

์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์„ ๋ชจ๋‘ ์ด์šฉํ•˜์—ฌ ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ์งœ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ "ICN" ๊ณตํ•ญ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๊ณต๊ถŒ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด tickets๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณตํ•ญ ๊ฒฝ๋กœ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

  • ๋ชจ๋“  ๊ณตํ•ญ์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž 3๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๊ณตํ•ญ ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ 10,000๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • tickets์˜ ๊ฐ ํ–‰ [a, b]๋Š” a ๊ณตํ•ญ์—์„œ b ๊ณตํ•ญ์œผ๋กœ ๊ฐ€๋Š” ํ•ญ๊ณต๊ถŒ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์€ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์ผ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ์•ž์„œ๋Š” ๊ฒฝ๋กœ๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]] ["ICN", "JFK", "HND", "IAD"]
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]

 

 

โœ๏ธ ํ’€์ด

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ์—๋Š” ๊ณตํ•ญ์˜ ์ˆ˜๊ฐ€ 10000๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์•…์˜ ๊ฒฝ์šฐ 10000! ๋ผ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ํฐ ์ˆ˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ ์™„์ „ ํƒ์ƒ‰์€ ์• ์ดˆ์— ์‹œ์ž‘๋„ ํ•˜์ง€ ์•Š์•˜๋‹ค.

 

DFS๋ฅผ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ถœ๋ฐœ์ง€์™€ ๋„์ฐฉ์ง€๊ฐ€ ๋“ค์–ด์žˆ๋Š” tickets ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” ์ถœ๋ฐœ์ง€๋ฅผ ํ‚ค๋กœ ๊ฐ€์ง€๊ณ  ๋„์ฐฉ์ง€๋ฅผ ๋ฐฐ์—ด์˜ ์›์†Œ๋กœ ์žก์•˜๋‹ค. ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ œ์ผ ์•ž์„œ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ž˜ํ”„์˜ ๋„์ฐฉ์ง€ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ด์ฃผ๋ฉฐ ๋„์ฐฉ์ง€์˜ ๊ฐœ์ˆ˜๋Œ€๋กœ ์‚ฌ์šฉํ•œ ํ•ญ๊ณต๊ถŒ์„ ์ฒดํฌํ•  ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์คฌ๋‹ค.

 

์ถœ๋ฐœ์ง€๋Š” ๋ฌด์กฐ๊ฑด ์ธ์ฒœ(ICN)์ด๋ฏ€๋กœ ๋‹ต์ด ๋  ์ž„์‹œ ๋ฐฐ์—ด์— ICN๋ฅผ ๋„ฃ์–ด๋‘๊ณ  ํ˜„์žฌ ๋„์‹œ์™€ ์‚ฌ์šฉํ•œ ํ‹ฐ์ผ“์ˆ˜(cnt)๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉฐ DFS๋ฅผ ๋Œ๋ ธ๋‹ค. ๋งŒ์•ฝ ์ด๋ฏธ ์‚ฌ์šฉํ•œ ํ•ญ๊ณต๊ถŒ์ธ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์ž„์‹œ ์ •๋‹ต ๋ฐฐ์—ด์— ๋„์ฐฉ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฒดํฌ๋ฐฐ์—ด์— ์ฒดํฌํ•œ ์ดํ›„ ์žฌ๊ท€ ํ˜•์‹์œผ๋กœ DFS๊ฐ€ ๋˜ ๋Œ์•„๊ฐ„๋‹ค. ๋Œ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•œ ํ‹ฐ์ผ“์˜ ์ˆ˜๊ฐ€ ์ด ํ‹ฐ์ผ“์˜ ์ˆ˜์™€ ๋™์ผํ•˜๋‹ค๋ฉด ๋ชจ๋“  ํ‹ฐ์ผ“์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ answer์— ์ž„์‹œ ์ •๋‹ต๋ฐฐ์—ด์„ ํ• ๋‹นํ•œ๋‹ค. answer์— ๊ฐ’์ด ์ž…๋ ฅ๋œ ์ดํ›„์—๋„ DFS๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž flag๋ฅผ true,  false๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.

 

๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋งž๋Š” ๋กœ์ง์ธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋Š”๋ฐ ํ˜„์žฌ ๋„์‹œ๊ฐ€ ๊ทธ๋ž˜ํ”„ ๋‚ด์— ์ถœ๋ฐœ์ง€๋กœ ๊ตฌ์„ฑ์ด ์•ˆ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ undefind๋ฅผ for๋ฌธ์œผ๋กœ ๋Œ๋ ธ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ๋‚ด์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” returnํ•จ์œผ๋กœ์จ ๋Œ๊ณ ์žˆ๋Š” DFS๋ฅผ ์ข…๋ฃŒ์‹œ์ผœ์ฃผ๋‹ˆ ํ†ต๊ณผ๋˜์—ˆ๋‹ค.

 

โŒจ๏ธ ์ฝ”๋“œ

function solution(tickets) {
  var answer = [];
  const len = tickets.length;

  const graph = {};
  for (const ticket of tickets) {
    const [start, end] = ticket;
    if (!graph[start]) graph[start] = [end];
    else graph[start].push(end);
  }

  const check = {};
  for (const key of Object.keys(graph)) {
    graph[key].sort();
    check[key] = new Array(graph[key].length).fill(0);
  }

  const path = ['ICN'];
  let isFinish = false;
  const dfs = (city, cnt) => {
    if (!graph[city]) return; 

    for (let i = 0; i < graph[city].length; i++) {
      if (isFinish) return;

      if (!check[city][i]) {
        path.push(graph[city][i]);
        check[city][i] = 1;
        cnt += 1;

        if (cnt === len) {
          isFinish = true;
          answer = [...path];
          return;
        }

        dfs(graph[city][i], cnt);

        cnt -= 1;
        check[city][i] = 0;
        path.pop();
      }
    }
  };

  dfs('ICN', 0);

  return answer;
}