본문 바로가기

백준

2873 롤러코스터

 

규칙 파악하는게 힘든 문제였다. 

구현도... 

 

별찍기 문제처럼 모든 경우 나눠가면서 풀어야 편하다. 아니면 뇌가.. 꼬여버려요..

 

보면 판이 홀수 * 홀수 / 홀 * 짝 / 짝 * 홀 / 짝 * 짝 이렇게 4가지 경우가 있다. 하나라도 홀수라면 모든 배열을 다 지나갈 수 있는데 짝 * 짝인 경우가 문제였다. 

 

이것도 어떻게 경우 나눠가며 풀었다.. 

 

처음 짤 때 엄청 더럽게 짰는데 정리하고 짜니 완전 깔끔히 짰다. 뿌듯

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

int mapv[1005][1005];

int main() {
    int r, c;
    scanf("%d %d", &r, &c);
    
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            scanf("%d", &mapv[i][j]);
        }
    }
    
    if (r % 2 == 1) {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c - 1; j++) {
                if (i % 2 == 0)
                    printf("R");
                else
                    printf("L");
            }
            if (i != r - 1)
                printf("D");
        }
        return 0;
    }
    
    if (c % 2 == 1) {
        for (int i = 0; i < c; i++) {
            for (int j = 0; j < r - 1; j++) {
                if (i % 2 == 0)
                    printf("D");
                else
                    printf("U");
            }
            if (i != c - 1)
                printf("R");
        }
        return 0;
    }
    
    int minv = 9999;
    int rx, cx;
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (i == 0 && j == 0)
                continue;
            if (i == r - 1 && j == c - 1)
                continue;
            if (i % 2 == 0 && j % 2 == 0)
                continue;
            if (i % 2 == 1 && j % 2 == 1)
                continue;
            if (minv < mapv[i][j])
                continue;
            rx = i;
            cx = j;
            minv = mapv[i][j];
        }
    }
    
    // printf("%d %d\n", rx, cx);
    
    if (rx % 2 == 1)
        rx--;
    
    for (int i = 0; i < rx; i++) {
        for (int j = 0; j < c - 1; j++) {
            if (i % 2 == 0)
                printf("R");
            else
                printf("L");
        }
        printf("D");
    }
    
    bool isCx = false;
    for (int i = 0; i < c; i++) {
        if (i == cx) {
            isCx = true;
            continue;
        }
        
        if (!isCx) {
            if (i % 2 == 0)
                printf("DR");
            else
                printf("UR");
            continue;
        }
        if (i % 2 == 0)
            printf("RU");
        else
            printf("RD");
    }
    
    
    for (int i = rx + 2; i < r; i++) {
        printf("D");
        for (int j = 0; j < c - 1; j++) {
            if (i % 2 == 0)
                printf("L");
            else
                printf("R");
        }
    }
}

'백준' 카테고리의 다른 글

16210 DSHS Bank  (0) 2021.07.24
18436 수열과 쿼리 37  (0) 2021.07.24
16923 다음 다양한 단어  (0) 2021.07.18
20149 선분 교차 3  (0) 2021.07.18
2090 조화평균  (0) 2021.07.17