Notice
Recent Posts
Recent Comments
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 2873 롤러코스터 본문

Programming/BOJ

[백준/BOJ] 2873 롤러코스터

he1fire 2021. 9. 20. 01:58
728x90

문제 : 2873 롤러코스터

 

2873번: 롤러코스터

첫째 줄에 가장 가장 큰 기쁨을 주는 롤러코스터는 가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸으로 어떻게 움직이면 되는지를 출력한다. 위는 U, 오른쪽은 R, 왼쪽은 L, 아래는 D로 출력한다. 정답

www.acmicpc.net

롤러코스터가 갈 수 있는 칸이 주어지고 이를 지나면서

가장 최대의 행복값을 가지도록 경로를 구현하는 문제이다.

기본적으로 홀*홀, 짝*홀, 홀*짝 경우에서는 ㄹ자로 순회하면 모든 칸을 지날 수 있으므로

행이나 열이 홀수인 방향을 찾아 모든 칸을 지나도록 경로를 만들어 출력하면 된다.

 

결국 이문제의 문제는 짝*짝 상황에서 어떻게 최댓값을 찾아내냐는 것인데

어찌어찌 머리를 굴리다 보면 [짝, 홀] 칸이나 [홀, 짝] 칸 하나만 지나지 않고

다른 모든칸을 지날 수 있는 것을 알 수 있다.

짝수 줄을 2줄씩 끊어 순회한다고 생각하면 결국 ㄷ자로 움직여서

왼쪽 위에서 왼쪽 아래로 오게 되는 것인데이를 오른쪽 아래로 보내기 위해서는

한 번만 반대방향으로 가면 되는 것을 알 수 있고 이를 이용하면 2*n칸에서

움직일 때 한 칸을 제외한 모든 칸을 순회하면서 반대방향으로 갈 수 있다는 사실을 알아낼 수 있다.

 

그렇기 때문에 먼저 [짝, 홀], [홀, 짝] 칸의 최솟값을 알아내고

그 칸이 포함된 2줄을 제외한 나머지 가로줄은 다 ㄷ자로 순회하고

그 줄만 그 칸을 건너뛰어서 넘어가는 경로를 만들어 출력해주면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, M, x, y, mn=1e9+7;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            ll a;
            cin >> a;
            if ((i+j)%2 && a<mn){
                mn=a;
                x=i, y=j;
            }
        }
    }
    if (N%2){
        for (int i=0;i<N;i++){
            for (int j=0;j<M-1;j++){
                if (i%2)
                    cout << "L";
                else
                    cout << "R";
            }
            if (i!=N-1)
                cout << "D";
        }
    }
    else if (M%2){
        for (int i=0;i<M;i++){
            for (int j=0;j<N-1;j++){
                if (i%2)
                    cout << "U";
                else
                    cout << "D";
            }
            if (i!=M-1)
                cout << "R";
        }
    }
    else{
        for (int i=0;i<(x/2)*2;i++){
            for (int j=0;j<M-1;j++){
                if (i%2)
                    cout << "L";
                else
                    cout << "R";
            }
            cout << "D";
        }
        ll dx=(x/2)*2, dy=0;
        while (1){
            if (dx==(x/2)*2+1 && dy==M-1)
                break;
            if (dx==(x/2)*2 && (dx+1!=x || dy!=y)){
                cout << "D";
                dx++;
            }
            if (dy<M-1 && (dx!=x || dy!=y)){
                cout << "R";
                dy++;
            }
            if (dx==(x/2)*2+1 && dy==M-1)
                break;
            if (dx==(x/2)*2+1 && (dx-1!=x || dy!=y)){
                cout << "U";
                dx--;
                if (dy<M-1 && (dx!=x || dy!=y)){
                    cout << "R";
                    dy++;
                }
            }
        }
        for (int i=(x/2+1)*2;i<N;i++){
            cout << "D";
            for (int j=0;j<M-1;j++){
                if (i%2)
                    cout << "R";
                else
                    cout << "L";
            }
        }
    }
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 13146 같은 수로 만들기 2  (0) 2022.09.16
[백준/BOJ] 10165 버스 노선  (0) 2022.09.16
[백준/BOJ] 20041 Escaping  (0) 2021.09.18
[백준/BOJ] 3321 가장 큰 직사각형  (0) 2021.09.18
[백준/BOJ] 2573 빙산  (0) 2021.01.08
Comments