๐Ÿงฉ Algorithm/SWEA

[SWEA] 1209. [S/W ๋ฌธ์ œํ•ด๊ฒฐ ๊ธฐ๋ณธ] 2์ผ์ฐจ - Sum (Python/D3)

devCloud 2024. 10. 25. 15:31
728x90

[๋ฌธ์ œ ๋งํฌ] ๐Ÿ‘‡

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


ํ’€์ด

๐Ÿ’ก ์Šฌ๋ผ์ด์‹ฑ, ํ–‰ ์—ด ๋ณ€ํ™˜, sum(), max() ์ด์šฉ

 

 

๐Ÿ“Œ ๊ฐ ํ–‰, ์—ด์˜ ํ•ฉ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

for i in range(100):
    sum_num = sum(board[i][:])
  • [ : ]
    • ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ์Šฌ๋ผ์ด์‹ฑ ํ•œ๋‹ค.
    • [5 : ] = 5๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์Šฌ๋ผ์ด์‹ฑ, [5 : 7] = 5๋ถ€ํ„ฐ 6๊นŒ์ง€ ์Šฌ๋ผ์ด์‹ฑ, [ : 8] = ์ฒ˜์Œ๋ถ€ํ„ฐ 7๊นŒ์ง€ ์Šฌ๋ผ์ด์‹ฑ
  • sum(board[i][:])
    • i๊ฐ€ 0๋ถ€ํ„ฐ 99๊นŒ์ง€ ์›€์ง์ด๋ฏ€๋กœ ๊ฐ ํ–‰์˜ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค.

 

๐Ÿ“Œ ํ–‰ ์—ด์„ ์„œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•

new_board = list(map(list, zip(*board)))

 

  • zip(*board)
    • zip์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”(iterable, ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด)์„ ๋ณ‘๋ ฌ๋กœ ๋ฌถ์–ด์„œ ๊ฐ ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋“ค์„ ํŠœํ”Œ(tuple)๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ *board๋Š” ๋ฆฌ์ŠคํŠธ board์˜ ๊ฐ ํ–‰์„ ๊ฐœ๋ณ„์ ์œผ๋กœ zip์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ฆ‰, *board๋Š” board์˜ ๋ชจ๋“  ํ–‰์„ ๊ฐ๊ฐ์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.
    • zip(*board)์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ ์—ด์„ ํŠœํ”Œ๋กœ ๋ฌถ์€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋œ๋‹ค.
  • map(list, zip(*board))
    • zip(*board)์˜ ๊ฒฐ๊ณผ๋Š” ํŠœํ”Œ์ด๋ฏ€๋กœ, ์ด๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
    • map(list, zip(*board))๋Š” zip(*board)์˜ ๊ฐ ํŠœํ”Œ์„ list๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • list(map(list, zip(*board))):
    • map์˜ ๊ฒฐ๊ณผ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, list()๋กœ ๊ฐ์‹ธ ์ตœ์ข…์ ์œผ๋กœ list ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    • ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ํ–‰๊ณผ ์—ด์ด ์ „ํ™˜๋œ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œ๋‹ค.

 

๐Ÿ“Œ ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

result = max(row_max, col_max, dia_max)
  • row_max, col_max, dia_max
    • ํ–‰์˜ ํ•ฉ ์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’, ์—ด์˜ ํ•ฉ ์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’, ๋Œ€๊ฐ์„ ์˜ ํ•ฉ ์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’์ด๋‹ค.
  • max()
    • ์ตœ๋Œ“๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒŒ์ด์ฌ์˜ ๋‚ด์žฅ ํ•จ์ˆ˜๋‹ค. 
    • ์ธ์ž๋กœ ์ •์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ตœ๋Œ“๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

Solution

def calc(board):
    max_sum = 0
    for i in range(100):
        sum_num = sum(board[i][:])  # 0~99 ์ธ๋ฑ์Šค์˜ ์ „์ฒด ํ•ฉ ๊ตฌํ•˜๊ธฐ
        max_sum = max(sum_num, max_sum)  # ํ•ฉ๊ณ„์˜ ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ
    return max_sum

def diagonal(board):
    right_sum, left_sum = 0, 0
    for i in range(100):
        right_sum += board[i][i]  # ์˜ค๋ฅธ ๋Œ€๊ฐ
        left_sum += board[i][99 - i]  #์™ผ ๋Œ€๊ฐ
    return max(right_sum, left_sum)

for _ in range(10):
    test_case = int(input())
    board = [list(map(int, input().split())) for _ in range(100)]
    row_max = calc(board)  # ํ–‰์˜ ํ•ฉ
    # ํ–‰ ์—ด ๋ณ€ํ™˜ ํ›„ ์—ด์˜ ํ•ฉ
    new_board = list(map(list, zip(*board)))
    col_max = calc(new_board)
    # ๋Œ€๊ฐ์„  ์ตœ๋Œ“๊ฐ’
    dia_max = diagonal(board)
    result = max(row_max, col_max, dia_max)
    print(f"#{test_case} {result}")

 

์ฝ”๋“œ์˜ ํšจ์œจ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.

 

์ˆ˜์ • ํฌ์ธํŠธ

  • calc ํ•จ์ˆ˜์—์„œ ์ „์ฒด ํ•ฉ ๊ณ„์‚ฐ ๋ฐฉ์‹ ๋‹จ์ˆœํ™”
    • sum(board[i][:]) ๋Œ€์‹  sum(board[i])๋กœ๋„ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ์ „์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์Šฌ๋ผ์ด์‹ฑ [:]์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋ฅผ sum์— ์ „๋‹ฌํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
  • diagonal ํ•จ์ˆ˜์˜ ์ค‘๋ณต๋œ max ๊ตฌ๋ฌธ ์ œ๊ฑฐ
    • ํ˜„์žฌ ๋Œ€๊ฐ์„ ์˜ ํ•ฉ ์ค‘ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ max ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธ์ถœ๋ถ€์—์„œ ์ด๋ฏธ ์ตœ๋Œ€๊ฐ’์„ ๋น„๊ตํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ diagonal ํ•จ์ˆ˜๋Š” ๋‘ ๋Œ€๊ฐ์„ ์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ๋งŒ ํ•˜๊ณ , result = max(row_max, col_max, right_sum, left_sum)๋กœ ์ตœ๋Œ€๊ฐ’์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ.
  • ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
    • ๊ฐ ์„น์…˜์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•œ ์ฃผ์„์„ ๋‹ฌ๋ฉด ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๋Œ€๊ฐ์„  ํ•ฉ์˜ ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌ
    • diagonal ํ•จ์ˆ˜๊ฐ€ ๋‘ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ , ํ˜ธ์ถœ๋ถ€์—์„œ ์ตœ์ข… max ๋น„๊ต๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

์ตœ์ ํ™”๋œ ์ฝ”๋“œ

def calc(board):
    max_sum = 0
    # ๊ฐ ํ–‰์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
    for i in range(100):
        sum_num = sum(board[i])  # ๊ฐ ํ–‰์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ
        max_sum = max(sum_num, max_sum)  # ํ˜„์žฌ ํ–‰ ํ•ฉ๊ณ„์™€ ์ตœ๋Œ€๊ฐ’ ๋น„๊ต
    return max_sum

def diagonal(board):
    right_sum, left_sum = 0, 0
    # ์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ ๊ณผ ์™ผ์ชฝ ๋Œ€๊ฐ์„ ์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ
    for i in range(100):
        right_sum += board[i][i]          # ์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ 
        left_sum += board[i][99 - i]      # ์™ผ์ชฝ ๋Œ€๊ฐ์„ 
    return right_sum, left_sum

# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰
for _ in range(10):
    test_case = int(input())
    board = [list(map(int, input().split())) for _ in range(100)]

    # ํ–‰์˜ ์ตœ๋Œ€ ํ•ฉ
    row_max = calc(board)
    # ํ–‰๊ณผ ์—ด์„ ๋ณ€ํ™˜ํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์—ด์˜ ์ตœ๋Œ€ ํ•ฉ
    col_max = calc(list(map(list, zip(*board))))
    # ๋Œ€๊ฐ์„ ์˜ ๋‘ ํ•ฉ
    right_sum, left_sum = diagonal(board)

    # ๋ชจ๋“  ์ตœ๋Œ€๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’
    result = max(row_max, col_max, right_sum, left_sum)
    print(f"#{test_case} {result}")

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป ํšŒ๊ณ 

๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฑฐ ๋นผ๊ณ ๋Š” ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฐ์ž ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋‚˜๋ˆ ์„œ ๊ณ„์‚ฐํ•ด์„œ ๋ณด๊ธฐ์—๋„ ํŽธํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ฐ€๋…์„ฑ๊ณผ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋“ค์–ด๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๊ฝค ์ž˜ ํ‘ผ ๊ฒƒ ๊ฐ™๋‹ค.  

 


 

728x90