[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›์€ ์„ ๋ฌผ(ํŒŒ์ด์ฌ, ๊ตฌํ˜„, 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(n22)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 


  
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)

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€