[백준] 1959번: 달팽이3

2022. 9. 20. 20:23TIL💡/Algorithms

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

 

1959번: 달팽이3

첫째 줄에 표의 모든 칸이 채워질 때까지 선이 꺾어지는 횟수를 출력한다. 둘째 줄에 끝나는 점의 좌표를 출력한다. 왼쪽 위 칸의 좌표를 (1, 1), 오른쪽 아래 칸의 좌표를 (M, N)이라고 하자.

www.acmicpc.net

처음부터 2차원 배열을 만들어서 구현할 생각은 애시당초 접는다. 지나치게 m, n의 범위가 크기 때문이다.

대신에 상하좌우 이동 제한의 변수를 만들어서 반복적으로 탐색을 하려했는데, 이것도 시간초과가 발생한다.

결국엔 공식을 파악해서 조건문으로 문제를 풀어야 한다.

빠르게 공식을 구하기는 어렵고, 스스로 케이스를 나눠서 공식을 추리해야 한다.

 

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    long m, n;
    cin >> m >> n;
    
    if(m > n) {
        // 좌 + 우 + 한 번 더 꺾기 때문
        printf("%ld\n", 2 * (n - 1) + 1);
    }
    else {
        printf("%ld\n", 2 * (m - 1));
    }
    if(m == n) {
        if(m % 2 == 1) {
            printf("%ld %ld", (m - 1) / 2 + 1, (m - 1) / 2 + 1);
        }
        else {
            printf("%ld %ld", m / 2 + 1,  m / 2);
        }
    }
    else {
        if(n > m) {
            if(m % 2 == 0) {
                printf("%ld %ld", m / 2 + 1, m / 2);
            }
            else {
                printf("%ld %ld", m / 2 + 1, m / 2 + 1 + (n - m));
            }
        }
        else {
            if(n % 2 == 0) {
                printf("%ld %ld", n / 2 + 1, n / 2);
            }
            else {
                printf("%ld %ld", n / 2 + 1 + (m - n), n / 2 + 1);
            }
        }
    }
}

'TIL💡 > Algorithms' 카테고리의 다른 글

[백준] 2164번: 카드2  (0) 2022.09.22
[백준] 2075번: N번째 큰 수  (0) 2022.09.20
[백준] 1913번: 달팽이  (0) 2022.09.20
[백준] 1890번: 점프  (0) 2022.09.20
2차원 배열 쓰지 않고 달팽이 배열 만들기  (0) 2022.09.19