DevYoon

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์‹คํŒจ์œจ (Python) ๋ณธ๋ฌธ

PS/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์‹คํŒจ์œจ (Python)

gimewn 2022. 10. 30. 23:55

link ๐Ÿ”— https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

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

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

programmers.co.kr

 

 

๐Ÿ’ฌ ์‹œ๊ฐ„์ดˆ๊ณผ ๋ฐ›์€ ์ฝ”๋“œ

- ์ฒ˜์Œ์—๋Š” ์Šคํ…Œ์ด์ง€๋ณ„๋กœ ๋„๋‹ฌํ•œ ์‚ฌ๋žŒ๊ณผ ๋„์ „ ์ค‘์ธ ์‚ฌ๋žŒ์„ ๊ฐ๊ฐ arrival๊ณผ challenge ๋ฐฐ์—ด์— ๊ธฐ๋กํ•˜๊ณ , ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ์‹คํŒจ์œจ์„ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.

- ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์‹คํŒจ์œจ ๋‚ด๋ฆผ์ฐจ์ˆœ, ์Šคํ…Œ์ด์ง€ ์ˆซ์ž ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ํ›„ answer์— ์Šคํ…Œ์ด์ง€ ์ˆซ์ž๋งŒ append ํ•ด์ฃผ์—ˆ๋‹ค.

- ๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋ฐ›์•˜๋‹คใ… ใ… 

def solution(N, stages):
    answer = []
    arrival = [0]*(N+1)
    challenge = [0]*(N+1)
    fail = {}

    # stages๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋„๋‹ฌํ•œ ์Šคํ…Œ์ด์ง€์™€ ํ˜„์žฌ ๋„์ „ ์ค‘์ธ ์Šคํ…Œ์ด์ง€๋ฅผ ์นด์šดํŠธํ•ด์ค€๋‹ค.
    for stage in stages:
        # stage๊ฐ€ N+1์ผ ๊ฒฝ์šฐ limit์„ stage๋กœ ๋‘”๋‹ค => 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ฒดํฌ
        if stage == N+1:
            limit = stage
        # ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, limit์„ stage+1๋กœ ๋‘”๋‹ค => 1๋ถ€ํ„ฐ stage๊นŒ์ง€ ์ฒดํฌ
        else:
            limit = stage+1

        for num in range(1, limit):
            arrival[num] += 1

        # ๋ชจ๋“  ์Šคํ…Œ์ด์ง€๋ฅผ ํ†ต๊ณผํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์Šคํ…Œ์ด์ง€ ๋ณ„๋กœ ๋„์ „ ์ค‘์ธ ์œ ์ € ์นด์šดํŠธ
        if stage != N+1:
            challenge[stage] += 1

    # ์‹คํŒจ์œจ ๊ตฌํ•˜๊ธฐ => ๋„์ „์ž / ๋„๋‹ฌ์ž
    for num in range(1, N+1):
        fail[num] = challenge[num] / arrival[num]

    # ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
    fail_array = list(fail.items())

    # ์‹คํŒจ์œจ ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ, ์Šคํ…Œ์ด์ง€ ์ˆซ์ž ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    fail_array.sort(key=lambda x : (-x[1], x[0]))

    # ์Šคํ…Œ์ด์ง€ ์ˆซ์ž๋งŒ ์ฐจ๋ก€๋กœ answer์— append
    for stage_num in fail_array:
        answer.append(stage_num[0])

    return answer

 

 

๐Ÿ’ฌ ํ†ต๊ณผํ•œ ์ฝ”๋“œ

- ์ƒ๊ฐ๊ณผ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋กœ์ง์„ ์ˆ˜์ •ํ•ด๋ณด์•˜๋‹ค. ์œ ์ € ์ˆ˜(stages์˜ ๊ธธ์ด)๋ฅผ length๋กœ ์„ ์–ธํ•˜๊ณ , 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๊ฐ ์Šคํ…Œ์ด์ง€์˜ ์‹คํŒจ์œจ์„ ๋ฐ”๋กœ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹คํŒจ์œจ์ด 0์„ ๋„˜๋Š”๋‹ค๋ฉด, ์œ ์ € ์ˆ˜์—์„œ ๋„์ „ ์ค‘์ธ ์‚ฌ๋žŒ ์ˆ˜๋ฅผ ๋นผ์ฃผ์—ˆ๋‹ค.

- ๊ทธ ํ›„ ์‹คํŒจ์œจ์„ ๋‹ด์€ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ •๋ ฌ ํ›„ ์Šคํ…Œ์ด์ง€ ์ˆซ์ž๋งŒ answer์— append ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์œ„์˜ ๋กœ์ง๊ณผ ๋™์ผํ•˜๋‹ค.

def solution(N, stages):
    answer = []
    fail = {}
    length = len(stages)

    # ์‹คํŒจ์œจ์ด 0 ์ดˆ๊ณผ์ด๋ฉด length์—์„œ ํ•ด๋‹น ๋‹จ๊ณ„์— ๋„์ „ ์ค‘์ธ ์‚ฌ๋žŒ ์ˆ˜ ๋นผ๊ธฐ
    for num in range(1, N+1):
        if length != 0:
            rate = stages.count(num) / length
            fail[num] = rate
            if rate > 0:
                length -= stages.count(num)
        else:
            fail[num] = 0

    # ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ์ „ํ™˜ํ•œ ํ›„, ์‹คํŒจ์œจ ๋‚ด๋ฆผ์ฐจ์ˆœ & ์Šคํ…Œ์ด์ง€ ์ˆซ์ž ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    fail_array = list(fail.items())
    fail_array.sort(key=lambda x:(-x[1], x[0]))

    # ์Šคํ…Œ์ด์ง€ ์ˆซ์ž๋งŒ answer์— append
    for item in fail_array:
        answer.append(item[0])

    return answer