|
| 1 | +// Anagram - ๋ย ๋ฌธ์์ด์ดย ๊ฐ์ย ์ํ๋ฒณ์ย ๊ฐ์ย ๊ฐ์๋งํผย ๊ฐ์ง๊ณ ย ์์ด์ผ ํจ. |
| 2 | + |
| 3 | +// O(n log n) - ์ ๋ ฌ ๋ฐฉ์ |
| 4 | +const isAnagram = (s, t) => { |
| 5 | + // 1๋จ๊ณ: ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ฉด ์ ๋ anagram ๋ถ๊ฐ โ ๋ฐ๋ก false ๋ฐํ |
| 6 | + if (s.length !== t.length) return false; |
| 7 | + |
| 8 | + // 2๋จ๊ณ: ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ์ชผ๊ฐ๊ณ โ ์ ๋ ฌํ๊ณ โ ๋ค์ ๋ฌธ์์ด๋ก ํฉ์น๊ธฐ |
| 9 | + const sortedS = s.split('').sort().join(''); |
| 10 | + const sortedT = t.split('').sort().join(''); |
| 11 | + |
| 12 | + // 3๋จ๊ณ: ์ ๋ ฌ๋ ๋ ๋ฌธ์์ด์ด ๊ฐ์ผ๋ฉด anagram |
| 13 | + return sortedS === sortedT; |
| 14 | +}; |
| 15 | + |
| 16 | +// O(n) - ํด์๋งต ๋ฐฉ์ |
| 17 | +const isAnagram2 = (s, t) => { |
| 18 | + // [์ฃผ์] s.length๋ ์ค์ ๋ฌธ์ ์๊ฐ ์๋ UTF-16 ์ฝ๋ ์ ๋ ์๋ฅผ ์
. - "The number of UTF-16 code units in the string" |
| 19 | + // ์ด๋ชจ์ง ๊ฐ์ ๋ฌธ์๋ ์ฝ๋ ์ ๋ 2๊ฐ๋ฅผ ์ฐจ์งํด์ ์ค์ ๋ฌธ์ ์์ ๋ค๋ฅผ ์ ์์. |
| 20 | + // "๐".length โ 2 (์ฝ๋ ์ ๋ ๊ธฐ์ค) |
| 21 | + // [..."๐"].length โ 1 (์ค์ ๋ฌธ์ ๊ธฐ์ค) |
| 22 | + // Unicode ์์ ๋์์ด ํ์ํ๋ฉด [...s].length !== [...t].length ๋ก ์์ . |
| 23 | + // ์ด ๋ฌธ์ ๋ ์๋ฌธ์ ์์ด ์ํ๋ฒณ๋ง ๋ค๋ฃจ๋ฏ๋ก s.length ์ฌ์ฉํด๋ ๋ฌด๋ฐฉ. |
| 24 | + if (s.length !== t.length) return false; |
| 25 | + |
| 26 | + const count = {}; |
| 27 | + |
| 28 | + // for...of๋ ์ค์ ๋ฌธ์ ๋จ์๋ก ์ํํ๋ฏ๋ก Unicode ์์ . |
| 29 | + // count[char]๊ฐ ์์ผ๋ฉด 0์ผ๋ก ์ด๊ธฐํ ํ +1. |
| 30 | + for (const char of s) { |
| 31 | + count[char] = (count[char] || 0) + 1; |
| 32 | + } |
| 33 | + |
| 34 | + // t์ ์๋ ๋ฌธ์๊ฐ count์ ์๊ฑฐ๋(0, undefined) โ s์ ์๋ ๋ฌธ์ โ false. |
| 35 | + for (const char of t) { |
| 36 | + if (!count[char]) return false; |
| 37 | + count[char]--; |
| 38 | + } |
| 39 | + |
| 40 | + // ๋ชจ๋ ๋ฌธ์๊ฐ ์์ง๋๋ฉด anagram. |
| 41 | + return true; |
| 42 | +}; |
0 commit comments