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

์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/์Šคํ„ฐ๋”” 0์ฃผ์ฐจ] ํ•ด์‹œ ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜ Lv.1 - ํŒŒ์ด์ฌ(Python)/ Counter, Hash

(2021.08.03)

 

๐Ÿ“‘ ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋”๋ณด๊ธฐ

๋ฌธ์ œ ์„ค๋ช…

์ˆ˜๋งŽ์€ ๋งˆ๋ผํ†ค ์„ ์ˆ˜๋“ค์ด ๋งˆ๋ผํ†ค์— ์ฐธ์—ฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹จ ํ•œ ๋ช…์˜ ์„ ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ์„ ์ˆ˜๊ฐ€ ๋งˆ๋ผํ†ค์„ ์™„์ฃผํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋งˆ๋ผํ†ค์— ์ฐธ์—ฌํ•œ ์„ ์ˆ˜๋“ค์˜ ์ด๋ฆ„์ด ๋‹ด๊ธด ๋ฐฐ์—ด participant์™€ ์™„์ฃผํ•œ ์„ ์ˆ˜๋“ค์˜ ์ด๋ฆ„์ด ๋‹ด๊ธด ๋ฐฐ์—ด completion์ด ์ฃผ์–ด์งˆ ๋•Œ, ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜์˜ ์ด๋ฆ„์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๋งˆ๋ผํ†ค ๊ฒฝ๊ธฐ์— ์ฐธ์—ฌํ•œ ์„ ์ˆ˜์˜ ์ˆ˜๋Š” 1๋ช… ์ด์ƒ 100,000๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • completion์˜ ๊ธธ์ด๋Š” participant์˜ ๊ธธ์ด๋ณด๋‹ค 1 ์ž‘์Šต๋‹ˆ๋‹ค.
  • ์ฐธ๊ฐ€์ž์˜ ์ด๋ฆ„์€ 1๊ฐœ ์ด์ƒ 20๊ฐœ ์ดํ•˜์˜ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ๊ฐ€์ž ์ค‘์—๋Š” ๋™๋ช…์ด์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

participant                                                               completion                                                                             return

["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์˜ˆ์ œ #1
"leo"๋Š” ์ฐธ์—ฌ์ž ๋ช…๋‹จ์—๋Š” ์žˆ์ง€๋งŒ, ์™„์ฃผ์ž ๋ช…๋‹จ์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ #2
"vinko"๋Š” ์ฐธ์—ฌ์ž ๋ช…๋‹จ์—๋Š” ์žˆ์ง€๋งŒ, ์™„์ฃผ์ž ๋ช…๋‹จ์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ #3
"mislav"๋Š” ์ฐธ์—ฌ์ž ๋ช…๋‹จ์—๋Š” ๋‘ ๋ช…์ด ์žˆ์ง€๋งŒ, ์™„์ฃผ์ž ๋ช…๋‹จ์—๋Š” ํ•œ ๋ช…๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ช…์€ ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

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

 ์ฒ˜์Œ ํ’€์ด๋Š” ์ •๋ง ๋ณ„๋กœ์˜€๋‹ค.

 '์Œ....๊ทธ๋ƒฅ completion ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ participant ๋ฐฐ์—ด์—์„œ ์ง€์šฐ๊ณ  ๋‚จ์€ ํ•˜๋‚˜๋ฅผ ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€?'

 ๋งž๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ต์€ ๋‚˜์˜ค์ง€๋งŒ ํšจ์œจ์„ฑ์—์„œ ๋‹ค ํƒˆ๋ฝํ•˜๋Š” ์ฐธ์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๊ณ  ๋งŒ๋‹ค.

def solution(participant, completion):
    answer = ''
    for i in range(len(completion)):
        if participant.count(completion[i]) >0:
            participant.remove(completion[i])

    return participant[0]

 

 ํ•œ ๋งˆ๋””๋กœ ์œ„ ์ฝ”๋“œ๋Š” ํšจ์œจ์ด ๋นต์ ์ธ ์ฝ”๋“œ์ธ ๊ฒƒ์ด๋‹ค!

 ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–กํ•˜๋Š๋ƒ. ๋‚˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋„ ๋ฏธ์ˆ™ํ•˜๊ณ ...๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋“ค๋„ ์ž˜ ๋ชจ๋ฅธ๋‹ค.

 ๋ฐฉ๋ฒ•์€ ๊ตฌ๊ธ€๋ง ๋ฟ!ใ… .ใ… 

 ์„ธ์ƒ์—” ์ฒœ์žฌ๋“ค์ด ๋งŽ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์Ÿ์•„์ ธ ๋‚˜์™”๋‹ค.

 ๊ทธ ์ค‘ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์— ๊ฐœ์ œ๋œ ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ

 

 

 

 Counter

 collections๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

 ๊ฒฐ๊ณผ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

 ๋ง์…ˆ, ๋บ„์…ˆ ์—ฐ์‚ฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์ฒ™์ด๋‚˜ ์ค‘์š”ํ•˜๋‹ค.

 ๋บ„์…ˆ์˜ ๊ฒฝ์šฐ -1์ด๋‚˜ ๊ทธ ์ดํ•˜์˜ ์ˆซ์ž๊ฐ€ ๋‚˜์™€๋„ 0์œผ๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉฐ, 0์ด ๋‚˜์˜ค๋ฉด ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

 <์ •๋‹ต ์ฝ”๋“œ>

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

 

 

 

 ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๊ถ๊ธˆํ•ด์„œ ๋ช‡ ๊ฐœ ์ฐ์–ด๋ณธ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.."andrew"๋ฅผ participant์— ์ถ”๊ฐ€ํ–ˆ๋‹ค.

participant = ["mislav", "stanko", "mislav", "ana", "andrew"]
completion = ["stanko", "ana", "mislav"]

def solution(participant, completion):
    tmp = Counter(participant)-Counter(completion)
    
    print(tmp)
    #1 ๊ฒฐ๊ณผ: Counter({'mislav':1, 'andrew':1})
    
    print(tmp['mislav'])
    #2 ๊ฒฐ๊ณผ: 1
    
    print(tmp.keys())
    #3 ๊ฒฐ๊ณผ: dict_keys(['mislav', 'andrew'])
    
    print(list(tmp))
    #4 ๊ฒฐ๊ณผ: ['mislav', 'andrew']
    
    print(list(tmp).sort())
    #5 ๊ฒฐ๊ณผ: None
    
    print(sorted(list(tmp)))
    #6 ๊ฒฐ๊ณผ: ['andrew', 'mislav']

 

 Counter๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋”•์…”๋„ˆ๋ฆฌ์˜ keys() ํ˜น์€ values() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 ๋”•์…”๋„ˆ๋ฆฌ๋Š” ์•ˆ์—์„œ๋Š” ์ธ๋ฑ์Šค ์ ‘๊ทผ์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, list๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 ์ด๋•Œ ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ 5๋ฒˆ์€ ๊ฒฐ๊ณผ๊ฐ€ ์•ˆ๋‚˜์˜ค๊ณ  6๋ฒˆ์€ ์ œ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. ํ ...

 ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด Counter๋กœ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฐฐ์—ด์„ sort()ํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ ํ›„์— sorted(list())๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

 

 

 

Hash

def solution(participant, completion):
	answer = ''
    temp = 0
    dic = {}
    for part in participant:
    	dic[hash(part)] = part 
        temp += int(hash(part))
	for com in completion:
		temp -= hash(com)
	answer = dic[temp]
	return answer

 

 hash()ํ•จ์ˆ˜๋Š” ๋“ค์–ด์˜จ ๊ฐ’์— ๋Œ€ํ•œ ๊ณ ์œ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค.

 ์ฆ‰ ๋“ค์–ด์˜จ ๊ฐ’(value)์— ๋Œ€ํ•œ ๊ณ ์œ ๊ฐ’(key) ์Œ์ด ์ง€์–ด์ง€๋Š”, ์ผ์ข…์˜ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 ๋”•์…”๋„ˆ๋ฆฌ์— ์ฐธ์—ฌ์ž๋“ค์˜ ํ•ด์‹œ ๊ฐ’(๊ณ ์œ  ๊ฐ’: Key)์™€ ์ด๋ฆ„ ๊ฐ’(Value)์„ ๋ชจ๋‘ ๋„ฃ์œผ๋ฉฐ, ํ•ด์‹œ๊ฐ’์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

 ๊ทธ๋ฆฌ๊ณ  ์™„์ฃผ์ž๋“ค์˜ ํ•ด์‹œ๊ฐ’์„ ์ฐธ์—ฌ์ž๋“ค์˜ ํ•ด์‹œ๊ฐ’ ํ•ฉ์—์„œ ๋บ€๋‹ค.

 ๋‹จ ํ•œ ๋ช…๋งŒ์ด ์™„์ฃผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ, ์™„์ฃผ์ž๋“ค์„ ๋ชจ๋‘ ๋นผ๊ณ  ๋‚˜๋ฉด temp์—๋Š” ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ๋‹จ ํ•œ ๋ช…์˜ ํ•ด์‹œ๊ฐ’๋งŒ์ด ๋‚จ๊ฒŒ ๋œ๋‹ค.

 ๊ทธ ํ•ด์‹œ๊ฐ’์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ Value ๊ฐ’(์ด๋ฆ„)์— ์ ‘๊ทผํ•œ๋‹ค.

 

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ