danbibibi
article thumbnail
Published 2023. 12. 27. 00:09
BOJ 10157번: 자리배정 문제 풀이/백준

문제

문제 바로가기> BOJ 10157번: 자리배정

 

10157번: 자리배정

첫 줄에는 공연장의 격자 크기를 나타내는 정수 C와 R이 하나의 공백을 사이에 두고 차례대로 주어진다. 두 값의 범위는 5 ≤ C, R ≤ 1,000이다. 그 다음 줄에는 어떤 관객의 대기번호 K가 주어진다.

www.acmicpc.net

 

풀이

달팽이 모양을 그릴 수록 R, C 칸이 한칸씩 감소하는 성질을 이용하여 문제를 해결했다! 

#include<iostream>
#include<vector>
#define pii pair < int, int>
using namespace std;

int C, R, K;
int dr[] = {1, 0, -1, 0}; // 상 우 하 좌
int dc[] = {0, 1, 0, -1};

void input(){
    cin >> C >> R;
    cin >> K;
}

pii solve(){
    if(C*R < K) return {0, 0}; // 좌석을 배정할 수 없는 경우

    int c = 1, r = 0;
    int ccnt = 0, rcnt = -1, order = 1;
    for (int d = 0; ; d++){
        d %= 4;            // 상우하좌 반복
        if(d==0 || d==2){  // 상하, r축
            rcnt++;
            for (int i = 0; i < R - rcnt; i++){
                r += dr[d];
                if(order++ == K) return {c, r};
            }
        }
        else{ // 좌우, c축
            ccnt++;
            for (int i = 0; i < C - ccnt; i++){
                c += dc[d];
                if(order++ == K) return {c, r};
            }
        }
    }
}

void output(pii res){
    if(res.first == 0) cout << 0;
    else cout << res.first << " " << res.second;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    input();
    output(solve());
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 9935번: 문자열 폭발  (0) 2024.01.05
BOJ 2666번: 벽장문의 이동  (0) 2024.01.03
BOJ 8983번: 사냥꾼  (0) 2023.12.22
BOJ 1079번: 쇠막대기  (0) 2023.12.15
BOJ 9047번: 6174  (0) 2023.12.11
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로