기록

백준_2169_로봇 조종하기 본문

코딩테스트/python

백준_2169_로봇 조종하기

youngyin 2022. 3. 22. 18:33

문제

https://www.acmicpc.net/problem/2169

 

2169번: 로봇 조종하기

첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.

www.acmicpc.net

풀이

DP

위치를 위, 오른쪽, 왼쪽으로 움직이면서 가장 큰 경우를 board에 저장한다.

1. 0번째 행의 경우, 오른쪽으로만 이동이 가능하다.

2. 1번째 ~ N-1번째 행까지, 오른쪽/왼쪽으로 이동이 모두 가능하다.

2-1. 왼쪽과 위쪽을 비교하여 구한 배열과

2-2. 오른쪽과 위쪽을 비교하여 구한 배열을 비교해 

해당 위치에서 가질 수 있는 최대값을 board에 저장한다.

 

코드

import sys
input = sys.stdin.readline

N, M = map(int, input().strip().split())
board = [list(map(int, input().strip().split())) for i in range(N)]

# 맨 윗줄
for j in range(1, M) :
    board[0][j] += board[0][j-1]
        
# 나머지
for i in range(1, N) :   
    startLeft = [board[i][j]+board[i-1][j] for j in range(M)]
    startRight = [board[i][j]+board[i-1][j] for j in range(M)]
    
    # →
    for j in range(1, M) : 
        startLeft[j] = max(startLeft[j], startLeft[j-1]+board[i][j]) 
    
    # ←
    for j in range(M-2, -1, -1) : 
        startRight[j] = max(startRight[j], startRight[j+1]++board[i][j])
    
    # 선택
    for j in range(M) : 
        board[i][j] = max(startLeft[j], startRight[j])

print(board[-1][-1])

'코딩테스트 > python' 카테고리의 다른 글

백준_가장 긴 증가하는 수열 세트 (1)  (0) 2022.03.22
백준_1937_욕심쟁이 판다  (0) 2022.03.22
백준_4386_별자리 만들기  (0) 2022.03.17
백준_17387_선분 교차2  (0) 2022.03.10
백준_2239_스도쿠  (0) 2022.03.07
Comments