[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›์€ ์„ ๋ฌผ(ํŒŒ์ด์ฌ, ๊ตฌํ˜„, 2024 KAKAO WINTER INTERNSHIP)

    ๋ฐ˜์‘ํ˜•

     

     

    ๐ŸŒฑ ๋ฌธ์ œ

     

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

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

    programmers.co.kr

     

    ๐ŸŒฑ ํ’€์ด

    1. ๋ณ€์ˆ˜ ์„ค์ •

    ๋ฌธ์ œ ์„ค๋ช…์— ์œ„์™€ ๊ฐ™์ด ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ๊ณผ ์„ ๋ฌผ ์ง€์ˆ˜๋ฅผ ํ‘œ๋กœ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š”๋ฐ, ์ด๊ฑธ ๊ทธ๋ž˜๋„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

    table์€ ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ด์„ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์ด๊ณ , gift_index๋Š” ์„ ๋ฌผ์ง€์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. answer๋Š” ๋‹ค์Œ ๋‹ฌ์— ๊ฐ๊ฐ ๋ฐ›์„ ์„ ๋ฌผ ๊ฐœ์ˆ˜๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ์ฆ‰, answer ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์ด ์ •๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค.

    table = [[0 for _ in range(len(friends))] for __ in range(len(friends))]
    gift_index = [0] * len(friends)
    answer = [0] * len(friends)

     

    2. ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ ๊ฐœ์ˆ˜์™€ ์„ ๋ฌผ ์ง€์ˆ˜ ์„ธ๊ธฐ

    ์ฃผ๊ณ  ๋ฐ›์€ ์„ ๋ฌผ ๊ธฐ๋ก์„ ๋‹ด์€ 1์ฐจ์› ๋ฌธ์ž์—ด ๋ฐฐ์—ด gifts ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ ์„ ๋ฌผ์ง€์ˆ˜์™€ ์ฃผ๊ณ ๋ฐ›์€ ์„ ๋ฌผ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•ด์„œ table๊ณผ gift_index๋ฅผ ์ฑ„์›Œ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

    for gift in gifts:
        give, take = gift.split(" ")
        give_idx, take_idx = friends.index(give), friends.index(take)
        gift_index[give_idx] += 1
        gift_index[take_idx] -= 1
        table[give_idx][take_idx] += 1

     

    3. ๋‹ค์Œ๋‹ฌ์— ๋ฐ›์„ ์„ ๋ฌผ ๊ณ„์‚ฐํ•˜๊ธฐ

     

    2์ฐจ์› ๋ฆฌ์ŠคํŠธ table์„ ์ œ๋Œ€๋กœ ์ฑ„์šฐ๋ฉด ์œ„์™€ ๊ฐ™์ด ์™„์„ฑ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด table์„ ๋Œ๋ฉด์„œ ๋ฐ›์„ ์„ ๋ฌผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋ฉด๋˜๋Š”๋ฐ, ์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๊ฐ™์€ ์ƒ‰์˜ ์นธ๋ผ๋ฆฌ ๋Œ€์†Œ๋น„๊ต๋ฅผ ํ•ด์„œ ๋” ์„ ๋ฌผ์„ ๋งŽ์ด ์ค€ ์‚ฌ๋žŒ์ด ๋‹ค์Œ ๋‹ฌ์— ๋ฐ›์„ ์„ ๋ฌผ์„ +1 ํ•ด์ค๋‹ˆ๋‹ค. ๋Œ€์†Œ๋น„๊ต๋ฅผ ํ–ˆ๋Š”๋ฐ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ์„ ๋ฌผ ์ง€์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

    ๋”ฐ๋ผ์„œ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ ํ•„์š”๊ฐ€ ์—†๊ณ , ๋ฐ˜๋งŒ ๋Œ๋ฉด ๋ฉ๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” $O(\frac{n^2}{2})$๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

     

    for i in range(len(friends)):
        for j in range(i + 1, len(friends)):
            if table[i][j] > table[j][i]:  # i๊ฐ€ ์ค€ ํšŸ์ˆ˜๊ฐ€ ๋” ๋งŽ์Œ
                answer[i] += 1
            elif table[i][j] < table[j][i]:  # j๊ฐ€ ์ค€ ํšŸ์ˆ˜๊ฐ€ ๋” ๋งŽ์Œ
                answer[j] += 1
            else:
                if gift_index[i] > gift_index[j]:
                    answer[i] += 1
                elif gift_index[i] < gift_index[j]:
                    answer[j] += 1

     

    ๐ŸŒฑ ์ •๋‹ต

    def solution(friends, gifts):
        answer = [0] * len(friends)
        table = [[0 for _ in range(len(friends))] for __ in range(len(friends))]
        
        # ์„ ๋ฌผ ์ง€์ˆ˜ ๊ณ„์‚ฐ
        gift_index = [0] * len(friends)
        for gift in gifts:
            give, take = gift.split(" ")
            give_idx, take_idx = friends.index(give), friends.index(take)
            gift_index[give_idx] += 1
            gift_index[take_idx] -= 1
            table[give_idx][take_idx] += 1
                            
        for i in range(len(friends)):
            for j in range(i + 1, len(friends)):
                if table[i][j] > table[j][i]: # i๊ฐ€ ์ค€ ํšŸ์ˆ˜๊ฐ€ ๋” ๋งŽ์Œ
                    answer[i] += 1
                elif table[i][j] < table[j][i]: # j๊ฐ€ ์ค€ ํšŸ์ˆ˜๊ฐ€ ๋” ๋งŽ์Œ
                    answer[j] += 1
                else:
                    if gift_index[i] > gift_index[j]:
                        answer[i] += 1
                    elif gift_index[i] < gift_index[j]:
                        answer[j] += 1
    
        return max(answer)

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€