본문 바로가기

백준 - 롤러코스터(2873) 본문

알고리즘

백준 - 롤러코스터(2873)

Seongjun_You 2023. 12. 12. 20:01

얘는 규칙성만 찾으면 그리 어렵진?? 않다.

그 규칙성 찾느라 하루가 걸렸다.

 

case. 1

홀수 홀수일 경우 그냥 지그재그로 더하면서 내려온다.

 

case. 2 

홀수 짝수일 경우도 지그재그로 더하면서 내려오면 된다.

 

case. 3

짝수 짝수일 경우가 골치 아프다.

일단 빠져야 할 칸을 찾아야 하는데

하나씩 해보니깐

체스판 형식으로 빠져야 할 애들이 정해져 있었다.

그중에서 가장 값이 작은 애를 빼준다.

그리고 빠진 값의 위치 값을 저장해 두었다가.

그 라인만 피해서 지그재그로 움직여 준다.

빠진 칸의 라인은 적절히 피해 주는 코드를 짜준다.

 

 

하나씩 노가다로 통해 얻은 결과이다.

 

n,m = map(int, input().split())
data = []
for _ in range(n):
    data.append(list(map(int, input().split())))
answer = ''
if (n%2)==1 or (m%2) == 1: # 홀수 홀수 or 홀수 짝수
    if m > n:
        print('R'*(m-1) + ('D' + 'L'*(m-1) + 'D' + 'R'*(m-1))*(n//2))
    else:
        print('D'*(n-1) + ('R' + 'U'*(n-1) + 'R' + 'D'*(n-1)) *(m//2))
    exit(0)
else:
    min_y = -1  # 뺴야할 애 찾기??????
    min_x = -1
    min_data = float('inf')
    for i in range(n):
        if (i % 2) == 0:
            k = 1
        else:
            k = 0
        for j in range(k,m,2):
            if min_data > data[i][j]:
                min_data = data[i][j]
                min_y = i
                min_x = j

    answer += ('R'*(m-1) + 'D' + 'L'*(m-1)+'D')*(min_y//2)
    pattern = list(('DRUR'*(m//2))[:(m*2)-2])
    if min_x == 0:
        pattern.insert(0, pattern.pop())
    else:
        pattern.insert((min_x*2)-1, pattern.pop())
    answer += ''.join(pattern)+'D'
    answer += ('L'*(m-1)+'D'+'R'*(m-1)+'D')*((n//2) - (min_y // 2)-1)
    print(answer[:m*n-2])

 

Comments