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

Algorithm

[Algorithm] ๋‹ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ

๐Ÿ“‹ ๋ฌธ์ œ ์„ค๋ช…

์–€์—์„œ๋Š” ๋งค๋…„ ๋‹ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ํ•ด์„ค์ง„๋“ค์€ ์„ ์ˆ˜๋“ค์ด ์ž๊ธฐ ๋ฐ”๋กœ ์•ž์˜ ์„ ์ˆ˜๋ฅผ ์ถ”์›”ํ•  ๋•Œ ์ถ”์›”ํ•œ ์„ ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1๋“ฑ๋ถ€ํ„ฐ 3๋“ฑ๊นŒ์ง€ "mumu", "soe", "poe" ์„ ์ˆ˜๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ์„ ๋•Œ, ํ•ด์„ค์ง„์ด "soe"์„ ์ˆ˜๋ฅผ ๋ถˆ๋ €๋‹ค๋ฉด 2๋“ฑ์ธ "soe" ์„ ์ˆ˜๊ฐ€ 1๋“ฑ์ธ "mumu" ์„ ์ˆ˜๋ฅผ ์ถ”์›”ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰ "soe" ์„ ์ˆ˜๊ฐ€ 1๋“ฑ, "mumu" ์„ ์ˆ˜๊ฐ€ 2๋“ฑ์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

์„ ์ˆ˜๋“ค์˜ ์ด๋ฆ„์ด 1๋“ฑ๋ถ€ํ„ฐ ํ˜„์žฌ ๋“ฑ์ˆ˜ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด players์™€ ํ•ด์„ค์ง„์ด ๋ถ€๋ฅธ ์ด๋ฆ„์„ ๋‹ด์€ ๋ฌธ์ž์—ด ๋ฐฐ์—ด callings๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฒฝ์ฃผ๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ์„ ์ˆ˜๋“ค์˜ ์ด๋ฆ„์„ 1๋“ฑ๋ถ€ํ„ฐ ๋“ฑ์ˆ˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • 5 ≤ players์˜ ๊ธธ์ด ≤ 50,000
    • players[i]๋Š” i๋ฒˆ์งธ ์„ ์ˆ˜์˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • players์˜ ์›์†Œ๋“ค์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • players์—๋Š” ์ค‘๋ณต๋œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • 3 ≤ players[i]์˜ ๊ธธ์ด ≤ 10
  • 2 ≤ callings์˜ ๊ธธ์ด ≤ 1,000,000
    • callings๋Š” players์˜ ์›์†Œ๋“ค๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฒฝ์ฃผ ์ง„ํ–‰์ค‘ 1๋“ฑ์ธ ์„ ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ถˆ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

["mumu", "soe", "poe", "kai", "mine"] ["kai", "kai", "mine", "mine"] ["mumu", "kai", "mine", "soe", "poe"]

 

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

์ด๋ฆ„์ด ๋ถˆ๋ฆฐ ํšŸ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•ด์„œ ๊ณ„์‚ฐํ•˜๋ ค๋‹ค๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋ถˆ๋ฆด ๋•Œ ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์ˆœ์œ„๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉฐ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค. 

 

์ด๋ฆ„์ด ๋ถˆ๋ ธ์„ ๋•Œ ๊ทธ ์„ ์ˆ˜์˜ ์ˆœ์œ„๋ฅผ ์•Œ์•„์•ผ ์•ž์˜ ์„ ์ˆ˜์™€ ์ˆœ์œ„๋ฅผ ๋ฐ”๊ฟ”์ค„์ˆ˜ ์žˆ๋Š”๋ฐ ๋งค๋ฒˆ ํƒ์ƒ‰ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ๋‘๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด๋Š” playerOfRanks๋กœ ์ˆœ์œ„๋ณ„๋กœ ํ•ด๋‹น ์ˆœ์œ„์˜ ์„ ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๋Š” ranksOfPlayer๋กœ ์„ ์ˆ˜์˜ ์ด๋ฆ„์„ ํ‚ค๋กœ ๊ทธ ์„ ์ˆ˜์˜ ์ˆœ์œ„๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„๋‹ค.

 

์ด๋ฆ„์ด ๋ถˆ๋ ธ์„ ๋•Œ ๋จผ์ € ์ด์ „ ์„ ์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆœ์œ„์™€ ํ•ด๋‹น ์ˆœ์œ„์˜ ์„ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๋˜ํ•œ, ์ถ”์›”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ์ถ”์›”ํ•œ ์„ ์ˆ˜์˜ ์ˆœ์œ„๋ฅผ ๋‹น๊ฒจ์ฃผ๊ณ  ์ถ”์›”ํ•œ ์ˆœ์œ„์˜ ์„ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

 

์ถ”์›”ํ•˜๋Š” ๋ชจ๋“  ๊ณผ์ •์ด ์ข…๋ฃŒ๋˜๋ฉด ์ˆœ์œ„๋ณ„ ์„ ์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฝ‘์•„ ์ˆœ์œ„๋Œ€๋กœ ์ •๋ ฌ์‹œ์ผœ์ฃผ๊ณ  ๋ฐฐ์—ด์˜ map ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ ์ˆ˜๋งŒ ๋‚จ๊ฒจ์ฃผ๊ณ  ๋ฐ˜ํ™˜ํ•ด์คฌ๋‹ค.

 

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

function solution(players, callings) {
  var answer = [];

  const playerOfRanks = {};
  const ranksOfPlayer = {};

  for (let i = 0; i < players.length; i++) {
    ranksOfPlayer[players[i]] = i;
    playerOfRanks[i] = players[i];
  }

  for (const calling of callings) {
    const playerRank = ranksOfPlayer[calling];
    ranksOfPlayer[playerOfRanks[playerRank - 1]] = playerRank;
    playerOfRanks[playerRank] = playerOfRanks[playerRank - 1];

    ranksOfPlayer[calling] = playerRank - 1;
    playerOfRanks[playerRank - 1] = calling;
  }

  answer = Object.entries(playerOfRanks)
    .sort((a, b) => a[0] - b[0])
    .map(p => p[1]);

  return answer;
}