|
| 1 | +import java.util.*; |
| 2 | + |
| 3 | +public class Geegong { |
| 4 | + |
| 5 | + /** |
| 6 | + * case 1. HashMap<String, List<String>> ์ผ๋ก velues ๋ฅผ ๋ฆฌํดํ๋ ๋ฐฉ๋ฒ |
| 7 | + * key ๊ฐ์ strs ์ ๊ฐ str ๋ค์ char array ๋ก ๋ณํํ ํ sorting ํ๋ค. |
| 8 | + * ๊ทธ๋ผ ๋์ผํ letter ๋ค์ ๊ฐ๋ ์์ด๋ค์ ์ํ
ํ์ ๋์ผํ char array ๋ฅผ ๊ฐ์ง๋ฏ๋ก ๊ทธ๋ฃนํ์ด ๊ฐ๋ฅํจ |
| 9 | + * |
| 10 | + * TimeComplexity: |
| 11 | + * O(N * L log L) = O(N) |
| 12 | + * -> N ์ strs ์ ๊ฐฏ์ |
| 13 | + * -> L ์ str ์ ๊ธธ์ด |
| 14 | + * -> L long L ์ str์ sorting ์๊ฐ ๋ณต์ก๋ |
| 15 | + * |
| 16 | + * space complexity: O(N) |
| 17 | + * |
| 18 | + * case 2. key : lower letter ๋ค๋ง ๋ณด์ฅ์ด ๋ ๊ฒฝ์ฐ char[26] ์ธ ๋ฐฐ์ด๋ค์ ๋ํด์ ์ธ๋ฑ์ค๊ฐ 0 ~ 25 ๊น์ง 'a' ~ 'z' ์ ๊ฐ์ ์๋ฏธํ๋ค๊ณ ํ๋ฉด |
| 19 | + * letter ๋ณ๋ก ์นด์ดํธ๋ฅผ ํด๋น๋๋ ์ธ๋ฑ์ค์ +1 ์ฉ ํ๊ณ ๊ตฌ๋ถ์('#")๋ก ๊ฐ letter ๋ณ ํ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋ key ๋ฅผ ๋ง๋ค์ด |
| 20 | + * ๊ฒฐ๊ตญ case1๊ณผ ์ ์ฌํ๊ฒ str ์ ํด๋น๋๋ key ๋ฅผ ๊ฐ๋ List<String> ์ ๊ฐ๋ hashMap ์ ๊ฐ์ง๊ฒ ํ๋ ๋ฐฉ๋ฒ |
| 21 | + * |
| 22 | + * Time complexity : |
| 23 | + * O(L * N) = O(N) |
| 24 | + * |
| 25 | + * Space complexity : |
| 26 | + * O(N) |
| 27 | + * |
| 28 | + * @param strs |
| 29 | + * @return |
| 30 | + */ |
| 31 | + public List<List<String>> groupAnagrams(String[] strs) { |
| 32 | + // case 1. |
| 33 | +// Map<String, List<String>> resultMap = new HashMap<>(); |
| 34 | +// |
| 35 | +// for (String str : strs) { |
| 36 | +// char[] chars = str.toCharArray(); |
| 37 | +// // sort |
| 38 | +// Arrays.sort(chars); |
| 39 | +// String key = new String(chars); |
| 40 | +// // key : sorted str, value : strs |
| 41 | +// resultMap.computeIfAbsent(key, k -> new ArrayList<>()).add(str); |
| 42 | +// } |
| 43 | +// |
| 44 | +// return new ArrayList<>(resultMap.values()); |
| 45 | + |
| 46 | + // case 2. |
| 47 | + Map<String, List<String>> resultMap = new HashMap<>(); |
| 48 | + for (String str : strs) { |
| 49 | + char[] chars = str.toCharArray(); |
| 50 | + char[] numberOfLetters = new char[26]; // 'a' ~ 'z' |
| 51 | +// Arrays.copyOf() |
| 52 | + |
| 53 | + for (char eachChar : chars) { |
| 54 | + numberOfLetters[eachChar - 'a']++; // ๊ฐ character ์ ํด๋น๋๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ 1์ฉ ๊ฐ์ ๋ํด๊ฐ๋ค ex) aba => ['2', '0', '0', ... ,'0'] / abfcb = ['1', '2', '1', '0', '0', '1', '0'...'0'] |
| 55 | + } |
| 56 | + |
| 57 | + StringBuilder keyMaker = new StringBuilder(2 * 26); |
| 58 | + for (char numberOfLetter : numberOfLetters) { |
| 59 | + keyMaker.append(numberOfLetter).append("#"); |
| 60 | + } |
| 61 | + |
| 62 | + resultMap.computeIfAbsent(keyMaker.toString(), input -> new ArrayList<>()).add(str); |
| 63 | + } |
| 64 | + |
| 65 | + return new ArrayList<>(resultMap.values()); |
| 66 | + } |
| 67 | + |
| 68 | + |
| 69 | +} |
0 commit comments