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

๐Ÿบ ๋งค์ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜

์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜
๋ฌธ์ œํ’€๋Ÿฌ๊ฐ€๊ธฐ

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

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

์ œํ•œ์‚ฌํ•ญ

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


def solution(participant, completion):
    answer = ''
    comp = completion
    for part in participant:
        if part not in comp:
            answer+= part
        else:
            comp.remove(part)
    return answer


์ด๋ผ๊ณ  ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

list ์•„์ดํ…œ์„ ์ฐพ์•„ ์‚ญ์ œํ•˜๋Š” remove ํ•จ์ˆ˜๊ฐ€ O(n)์‹œ๊ฐ„์ด ๊ฑธ๋ ค์„œ ์ด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)๋˜๋Š” ๋“ฏ ํ•˜๋‹ค.



def solution(participant, completion): p = sorted(participant) c = sorted(completion) # print(len(p), len(c)) for i in range(len(p)-1): if p[i] != c[i]: return p[i] return p[-1]

ํŒŒ์ด์ฌ์˜ ํ•จ์ˆ˜๋ณ„ ์‹œ๊ฐ„๋ณต์žก๋„ ๋„ํ๋ฉ˜ํ…Œ์ด์…˜์— ๋”ฐ๋ฅด๋ฉด ์ •๋ ฌํ•จ์ˆ˜๋Š” O(nlogn)์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

๋งค iteration๋งˆ๋‹ค ์‚ญ์ œ์—ฐ์‚ฐ์„ ํ•ด ์ด ์‹œ๊ฐ„๋ณต์žก๋„ O(n^2)์ด ๋‚˜์˜ค๋Š๋‹ˆ, ์ด ์‹œ๊ฐ„๋ณต์žก๋„ O(nlogn)+O(nlogn)์ด ๋‚ฌ๊ฒ ๋‹ค์‹ถ์–ด์„œ, ๋‘ ๋ฐฐ์—ด์„ sorted ํ•จ์ˆ˜๋กœ ์ •๋ ฌ ํ•œ ๋’ค O(n)์‹œ๊ฐ„ ๋งŒํผ ๋‹จ์ˆœ ๋น„๊ต์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.


์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ํ†ต๊ณผ (0.05ms, 12.2MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ํ†ต๊ณผ (0.05ms, 12.1MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ํ†ต๊ณผ (0.33ms, 12.2MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ํ†ต๊ณผ (0.70ms, 12.2MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ํ†ต๊ณผ (0.69ms, 12.3MB)
ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ํ†ต๊ณผ (53.58ms, 89.2MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ํ†ต๊ณผ (87.81ms, 127MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ํ†ต๊ณผ (124.47ms, 155MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ํ†ต๊ณผ (119.66ms, 170MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ํ†ต๊ณผ (134.45ms, 170MB)


๋กœ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ, collections.Counter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์ชฝ์ด ๋” ๊ฐ„๊ฒฐํ•ด๋ณด์ด๊ณ , ํšจ์œจ์„ฑ๋„ ์กฐ๊ธˆ ๋” ์ข‹๋‹ค.


import collections


def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ํ†ต๊ณผ (0.15ms, 12MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ํ†ต๊ณผ (0.13ms, 12.1MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ํ†ต๊ณผ (0.36ms, 12.2MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ํ†ต๊ณผ (0.60ms, 12.3MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ํ†ต๊ณผ (0.60ms, 12.4MB)
ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ 1 ใ€‰ํ†ต๊ณผ (34.02ms, 89.2MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ํ†ต๊ณผ (43.79ms, 129MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ํ†ต๊ณผ (78.56ms, 154MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ํ†ต๊ณผ (68.90ms, 170MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ํ†ต๊ณผ (86.31ms, 169MB)