๊ฐœ๋ฐœ/๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜

[leetcode] 49. Group Anagrams ํ’€์ด, ํ•ด์„ค (python)

ttoance 2023. 10. 14. 01:22

 

๋ฌธ์ œ ๋งํฌ 

https://leetcode.com/problems/group-anagrams/

 

Group Anagrams - LeetCode

Can you solve this real interview question? Group Anagrams - Given an array of strings strs, group the anagrams together. You can return the answer in any order. An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase

leetcode.com

 

'eat','aet','tae' ๋“ฑ์œผ๋กœ ๋™์ผํ•œ ์บ๋ฆญํ„ฐ๋กœ ์ˆœ์„œ๋งŒ ๋ฐ”๊ฟ”์„œ ๋‚˜์™”์„๋•Œ, 

ํ•ด๋‹น ๋ฌธ์ž์—ด๋“ค์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ชจ์•„์„œ ๋ฟŒ๋ ค์ฃผ๋Š” ๋ฌธ์ œ์ด๋‹ค. 

 

๋‚ด๊ฐ€ ๋จผ์ € ์ƒ๊ฐํ–ˆ๋˜ ๊ฑฐ๋Š” e1a1t1 ๋“ฑ์œผ๋กœ ๊ฐ๊ฐ ๋ฌธ์ž์™€ ์นด์šดํŠธ๋ฅผ ๋‚˜์—ดํ•œ๋‹ค์Œ์— ์ด๊ฑฐ๋ฅผ ํ‚ค๋กœ ํ•ด์„œ ํ•ด์‹œ๋งต์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ€๋ฉด ๋  ๊ฑฐ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ,

๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ a1e1t1๊ณผ a1t1e1 ์„ ๊ฐ™์€ key๋กœ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ์• ๋ฅผ ๋จน์–ด์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. 

 

1์ฐจ ํ’€์ด

1. ๋จผ์ € strs๋ฅผ ๋Œ๋ฉด์„œ ์•ŒํŒŒ๋ฒณ์„ ์ •๋ ฌํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด sortedStrs์— ์ €์žฅํ•œ๋‹ค. (eat -> aet, tae -> aet)

2. sortStrs๋ฅผ ๋‹ค์‹œ ์ •๋ ฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋™์ผํ•œ ๊ฒƒ๋ผ๋ฆฌ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

3. sortedStr๋ฅผ ๋Œ๋ฉด์„œ, ๊ฒฐ๊ณผ๊ฐ’ results์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’๊ณผ ํ˜„์žฌ ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฉด ๊ทธ ์ „์— ๋„ฃ์–ด์ฃผ๊ณ  ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋„ฃ์–ด์ค€๋‹ค. 

# 1. ๋จผ์ € strs๋ฅผ ๋Œ๋ฉด์„œ ์•ŒํŒŒ๋ฒณ์„ ์ •๋ ฌํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด sortedStrs์— ์ €์žฅํ•œ๋‹ค. (eat -> aet, tae -> aet)
sortedStrs = []
for str in strs:
    # ๋Œ๋ฉด์„œ eat -> aet ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌ 
    sortedStrs.append((str, ''.join(sorted(str))))


# 2. sortStrs๋ฅผ ๋‹ค์‹œ ์ •๋ ฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋™์ผํ•œ ๊ฒƒ๋ผ๋ฆฌ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 
sortedStrs.sort(key = lambda x:x[1])


# 3. sortedStr๋ฅผ ๋Œ๋ฉด์„œ, ๊ฒฐ๊ณผ๊ฐ’ results์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’๊ณผ ํ˜„์žฌ ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฉด ๊ทธ ์ „์— ๋„ฃ์–ด์ฃผ๊ณ  ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋„ฃ์–ด์ค€๋‹ค. 
results = [[sortedStrs[0][0]]]
# ๋™์ผํ•œ ๊ฒƒ๋ผ๋ฆฌ ๋ฌถ์–ด์ฃผ๊ธฐ 
for i in range(1, len(sortedStrs)):
    originalValue = sortedStrs[i][0]
    checkValue = sortedStrs[i][1]

    # ์ „์— ๊ฐ’๊ณผ ๋™์ผํ•˜๋‹ค๋ฉด, ์ „ ๋ฐฐ์—ด์— ๋„ฃ์–ด์ฃผ๊ณ  
    if sortedStrs[i - 1][1] == checkValue:
        results[-1].append(originalValue)
    # ์ „์— ๊ฐ’๊ณผ ๋‹ค๋ฅด๋ฉด, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€ 
    else:
        results.append([originalValue])

๋งˆ์ง€๋ง‰ 3๋ฒˆ ๊ณผ์ •์ด ๋ณต์žกํ•˜๊ธด ํ•œ๋ฐ, ์ง€๊ธˆ์™€์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด defaultdict๋ฅผ ์ด์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์•˜๋‚˜ ์‹ถ๋‹ค. 

 

2์ฐจ ํ’€์ด (ํ•ด์„ค ์ฐธ๊ณ )

ํ•ด์„ค ์œ ํˆฌ๋ธŒ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. 

https://www.youtube.com/watch?v=vzdNOK2oB2E 

49. Group Anagrams ํ•ด์„ค ๋งํฌ

์ผ๋‹จ ์ ‘๊ทผ ๋ฐฉ์‹ ์ž์ฒด๋Š” ์ฒซ๋ฒˆ์งธ ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ–ˆ๋‹ค. 

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ์€ 1. list๋ฅผ tuple๋กœ ๋ฐ”๊ฟ”์„œ dictionary์˜ key๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ. 2. ์•ŒํŒŒ๋ฒณ์˜ ๊ฐฏ์ˆ˜ count ์‹œ [0] * 26 ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. 

 

ํ’€์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

1. ๋จผ์ € strs๋ฅผ ๋Œ๋ฉด์„œ count ๋ฐฐ์—ด์— ์•ŒํŒŒ๋ฒณ ์ˆ˜๋ฅผ ๊ฐ๊ฐ ์นด์šดํŠธ ํ•œ๋‹ค. 

์ด๋•Œ, count ๋ฐฐ์—ด์˜ 0,1,2,...26์€ ์•ŒํŒŒ๋ฒณ a,....z์— ํ•ด๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ord๋ผ๋Š” ์•„์Šคํ‚ค๋ฐฐ์—ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค. 

2. ๊ทธ ๋‹ค์Œ count๋ฐฐ์—ด์„ tuple๋กœ ๋ฐ”๊ฟ” results ๋ฐฐ์—ด์˜ key๋กœ ์‚ฌ์šฉํ•ด ์ €์žฅํ•œ๋‹ค. 

3. results ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. 

 


# ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ๋”•์…”๋„ˆ๋ฆฌ์— ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
results = defaultdict(list)

# 1. ๋จผ์ € strs๋ฅผ ๋Œ๋ฉด์„œ count ๋ฐฐ์—ด์— ์•ŒํŒŒ๋ฒณ ์ˆ˜๋ฅผ ๊ฐ๊ฐ ์นด์šดํŠธ ํ•œ๋‹ค. 
## ์ด๋•Œ, count ๋ฐฐ์—ด์˜ 0,1,2,...26์€ ์•ŒํŒŒ๋ฒณ a,....z์— ํ•ด๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ord๋ผ๋Š” ์•„์Šคํ‚ค๋ฐฐ์—ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค. 

for s in strs:
    count = [0] * 26          # ์•ŒํŒŒ๋ฒณ ๋งŒํผ ๋งŒ๋“ค๊ธฐ 
    for c in s:
        # ์•„์Šคํ‚ค ์ฝ”๋“œ์—์„œ 'a'๋Š” 97์ด๊ณ , 'b'๋Š” 98, 'c'๋Š” 99, ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์† ์ฆ๊ฐ€
        count[ord(c) - ord('a')] += 1 

	
	2. ๊ทธ ๋‹ค์Œ count๋ฐฐ์—ด์„ tuple๋กœ ๋ฐ”๊ฟ” results ๋ฐฐ์—ด์˜ key๋กœ ์‚ฌ์šฉํ•ด ์ €์žฅํ•œ๋‹ค. 
    # count ๋ฅผ tuple ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์•ผ 'unhashable type:list ์•ˆ ๋ฐœ์ƒํ•จ '
    results[tuple(count)].append(s)


# 3. results๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 
return results.values()

 

ํ›จ์”ฌ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์กŒ๋‹ค !! 

 

์ฐธ๊ณ ๋กœ, ์ด ๋ฐฉ์‹์„ java์—์„œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ์ง€ ๊ถ๊ธˆํ•ด์„œ chatgpt์—๊ฒŒ ๋ฌผ์–ด๋ดค๋Š”๋ฐ,

์—ญ์‹œ ๋˜‘๋˜‘ํ•œ chatgpt

 

์•„๋ž˜์™€ ๊ฐ™์ด array๋ฅผ string์œผ๋กœ ๋ฐ”๊ฟ”์„œ key๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. 

String key = Arrays.toString(count);

 

chatgpt๊ฐ€ ์ œ๊ณตํ•ด์ค€ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

public static List<List<String>> groupAnagrams(String[] strs) {
    Map<String, List<String>> map = new HashMap<>();

    for (String s : strs) {
        int[] count = new int[26];
        for (char c : s.toCharArray()) {
            count[c - 'a']++;
        }

        // ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ‚ค๋กœ ์‚ฌ์šฉ
        String key = Arrays.toString(count);

        if (!map.containsKey(key)) {
            map.put(key, new ArrayList<>());
        }
        map.get(key).add(s);
    }

    return new ArrayList<>(map.values());
}

 

 

์ฐธ๊ณ ํ•ด๋ณด๋ฉด ์ข‹์„ ๋งํฌ 

https://ddoance.tistory.com/139

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด์ˆœ์„œ. neetcode ์ฐธ๊ณ ํ•ด์„œ leetcode ์ค€๋น„ํ•˜๊ธฐ (leethub)

neetcode ์ปค๋ฆฌ์–ด๋ฆฌ '๋ฆฌํŠธ์ฝ”๋“œ 569๋ฌธ์ œ ํ’€๊ณ  ๊ตฌ๊ธ€์— ์ž…์‚ฌํ•œ ์‚ฌ๋žŒ ์ด์•ผ๊ธฐ' ์„ ๋ณด๋‹ค๊ฐ€, ์ด ์‚ฌ์ดํŠธ๋ฅผ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค. https://neetcode.io/roadmap ์ด๋Ÿฐ์‹์œผ๋กœ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ’€๋ฉด ์ข‹์„์ง€ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ณ , ๊ฐ ๋ฌธ์ œ

ddoance.tistory.com

 

 

๋ฐ˜์‘ํ˜•