Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

JH 개발 블로그

백준 파이썬 2873 롤러코스터 본문

코딩테스트/백준

백준 파이썬 2873 롤러코스터

쿠우우훈 2022. 1. 23. 20:14
import sys

input = sys.stdin.readline
R,C = map(int,input().split())

if R%2 == 1:
    ans = ''
    for r in range(R):
        if r%2 == 0:
            ans += 'R'*(C-1)
        elif r%2 == 1:
            ans += 'D'+'L'*(C-1)+'D'
    print(ans)
elif C%2 == 1:
    ans = ''
    for c in range(C):
        if c%2 == 0:
            ans += 'D'*(R-1)
        elif c%2 == 1:
            ans += 'R'+'U'*(R-1)+'R'
    print(ans)
else:
    min_idx,min_val = [0,0],1000
    for r in range(R):
        if r%2 == 0:
            temp = list(map(int,input().split()))
            for c in range(1,C,2):
                if temp[c] < min_val:
                    min_val,min_idx = temp[c],[r,c]
        elif r%2 == 1:
            temp = list(map(int,input().split()))
            for c in range(0,C,2):
                if temp[c] < min_val:
                    min_val,min_idx = temp[c],[r,c]

    ans = ('R'*(C-1)+'D'+'L'*(C-1)+'D')*(min_idx[0]//2)
    r,c = 2*(min_idx[0]//2),0
    nr,nc = min_idx[0],min_idx[1]
    r_bound = r+1
    while r != r_bound or c != C-1:
        if r < r_bound and [r_bound,c] != min_idx:
            r += 1
            ans += 'D'
        elif r == r_bound and [r_bound-1,c] != min_idx:
            r -= 1
            ans += 'U'
        if c != C-1:
            c += 1
            ans += 'R'

    ans += ('D'+'L'*(C-1)+'D'+'R'*(C-1))*((R-1-min_idx[0])//2)

    print(ans)

1. R이 홀수일때

2. C가 홀수일때

3. R,C 둘다 짝수일때

 

경우의 수를 3개로 나눠서 조건에 맞게 구현하면 됩니다.

 

R,C 둘다 짝수 일때가 중요한데,

모든 좌표를 다 방문할 순 없습니다. 최소 한개의 좌표는 방문하지 못합니다.
그렇다면 최대기쁨을 구하는방법은 최소기쁨인 좌표 한군데만 방문하지 않는것입니다.

그런데, 여기서 알아야 할게 있습니다. 최소기쁨인 칸의 좌표를 [r,c] 라고 했을 때
만약 r+c가 짝수라면, 좌표 [r,c]를 방문하지 않을 뿐 아니라 추가적으로 방문하지 못하는 좌표(홀수)가 생깁니다.
하지만 r+c가 홀수라면, 오직 좌표[r,c] 하나만 방문하지 않습니다.

 

따라서 r+c가 짝수라서 좌표 [r,c]도 방문하지 않고, 추가적으로 홀수 좌표도 방문하지 않는다면
차라리 홀수 좌표 중에서 최소기쁨인 칸을 찾아내서, 그 칸만 방문하지 않으면 됩니다.

 

최소값 근처까지 이동한 후, while 문으로 최소값 근처에서의 이동경로를 구하고 그 다음에 목적지까지 이동하는 식으로 구현하면 됩니다.

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

백준 1783 파이썬 병든 나이트  (0) 2022.01.23
백준 파이썬 12970 AB  (0) 2022.01.23
백준 파이썬 11664 선분과 점  (0) 2022.01.11
백준 2448 파이썬 별찍기 - 11  (0) 2021.12.31
백준 파이썬 2447 별찍기 - 10  (1) 2021.12.31
Comments