โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
์์์๋ ๋งค๋ ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ๊ฐ ์ด๋ฆฝ๋๋ค. ํด์ค์ง๋ค์ ์ ์๋ค์ด ์๊ธฐ ๋ฐ๋ก ์์ ์ ์๋ฅผ ์ถ์ํ ๋ ์ถ์ํ ์ ์์ ์ด๋ฆ์ ๋ถ๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด 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๋ฑ์ธ ์ ์์ ์ด๋ฆ์ ๋ถ๋ฆฌ์ง ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
4๋ฑ์ธ "kai" ์ ์๊ฐ 2๋ฒ ์ถ์ํ์ฌ 2๋ฑ์ด ๋๊ณ ์์ 3๋ฑ, 2๋ฑ์ธ "poe", "soe" ์ ์๋ 4๋ฑ, 3๋ฑ์ด ๋ฉ๋๋ค. 5๋ฑ์ธ "mine" ์ ์๊ฐ 2๋ฒ ์ถ์ํ์ฌ 4๋ฑ, 3๋ฑ์ธ "poe", "soe" ์ ์๊ฐ 5๋ฑ, 4๋ฑ์ด ๋๊ณ ๊ฒฝ์ฃผ๊ฐ ๋๋ฉ๋๋ค. 1๋ฑ๋ถํฐ ๋ฐฐ์ด์ ๋ด์ผ๋ฉด ["mumu", "kai", "mine", "soe", "poe"]์ด ๋ฉ๋๋ค.
โ ์ฒ์ ์คํจํ ํ์ด
์ฒ์ ํ์ด์๋ caliing ๋ฐฐ์ด ๋ฐ๋ณต๋ฌธ ์์ players์ ๋ํ indexOf๋ฅผ ์ฌ์ฉํ์ฌ ํ์๋๋ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ ํ ์ด์คํธ ์ผ์ด์ค 3~4๊ฐ ์ ๋์์ ์คํจ๊ฐ ๋ด๋ค.
์ด์ ๋ ์ ํ ์ฌํญ์ ๋ณด๋ฉด players์ ์ต๋ ๊ธธ์ด๋ 50,000์ด๊ณ callings์ ์ต๋ ๊ธธ์ด๋ 1,000,000์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์์ indexOf๋ฅผ ์ฌ์ฉํด์ O(n^2)์ด ๋๋๋ฐ ์ต์ ์ ๊ฒฝ์ฐ์ 50,000,000,000๋ฒ ์ฐ์ฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋์จ ๊ฒ ๊ฐ๋ค.
function solution(players, callings) {
const hash = new Map();
callings.forEach(name => {
const currIdx = players.indexOf(name);
[players[currIdx], players[currIdx - 1]] = [players[currIdx - 1], players[currIdx]];
})
return players;
}
๐ก ์ฑ๊ณตํ ํ์ด
function solution(players, callings) {
const hash = new Map();
players.forEach((name, index) => {
hash.set(name, index);
})
callings.forEach(name => {
const currIdx = hash.get(name);
const front = players[currIdx - 1];
[players[currIdx], players[currIdx -1]] = [players[currIdx -1], players[currIdx]];
hash.set(name, hash.get(name) - 1);
hash.set(front, hash.get(name) + 1);
})
return players;
}
hash ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ํ์ดํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๊ฟจ๋ค.
object์ key๋ก ์ ๊ทผํ ๋ bigO๋ O(1)์ด๋ค.
๋จผ์ , players์ name์ key, ํด๋น index๋ฅผ value๋ก ์ด๊ธฐํํด์ฃผ์๋ค.
๋ค์์ผ๋ก callings์ ๋ํ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋๋ฐ,
์ด๊ธฐํํด์ฃผ์๋ hash์ callings์ ๋ํ ์์(์ด๋ฆ)๋ก key์ ์ ๊ทผํด์ value๋ฅผ currIdx์ ๋ด์๋์๋ค.
๊ทธ๋ผ ํด๋น ์ด๋ฆ์ index๋ฅผ ๋ฐ์์๊ณ ์ด๋ฆ์ด ๋ถ๋ฆฐ ์์ฌ๋๊ณผ ์์น๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค.
์์ฌ๋์ ์ด๋ฆ์ fornt๋ผ๋ ๋ณ์์ currIdx - 1 ๊ฐ์ ๋ด์๋์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ก์ index ๊ฐ์ ๋ฐ๊ฟ์ฃผ๊ณ ,
hash์ ๋ฐ๋ index๋ก ์๋ก ๋ฐ๊ฟ ์ฃผ๋ฉด์ ๋ฐ๋ณต๋ฌธ์ ๋๊น์ง ๋๊ฒ ๋๋ฉด ๋์ด ๋๋ค.
์ด๋ ๊ฒ ๋ฐ๋ณต๋ฌธ ์์ indexOf๋ฅผ ๋๋ ธ์ ๋๋ O(N^2)์ด์ง๋ง hash๋ฅผ ์ด์ฉํด์ O(N)์ผ๋ก ํด๊ฒฐํด ์ฃผ์๋ค.
โ ์ฑ์