본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver V] 크로스워드 퍼즐 - 9626

[문제 위치]

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

[문제 풀이]
이 문제는 구현(체스 패턴+오버레이) 를 통해 해결하는 문제이다.
퍼즐의 바깥을 위 U, 왼 L, 오 R, 아래 D만큼 테두리로 확장하면 전체 격자 크기는 (M+U+D)×(N+L+R)이고, 테두리는 체스판 무늬로 #와 .을 번갈아 배치하면 된다. 퍼턴은 (행+열)의 합이 짝수면 #, 홀수면 .이므로 이 규칙으로 전체를 채운 뒤, 원래 퍼즐 문자를 (U,L)에서 시작해 격자 위에 그대로 덮어쓰기해서 출력하게 해결한다
아래는 이를 구현한 코드이다.

#include <bits/stdc++.h>
using namespace std;

#define FASTIO ios::sync_with_stdio(false); cin.tie(nullptr);

int main(){
    FASTIO;
    int M, N; 
    if(!(cin >> M >> N)) return 0;
    int U, L, R, D;
    cin >> U >> L >> R >> D;

    int H = M + U + D;
    int W = N + L + R;

    vector<string> g(H, string(W, '.'));
    // 체스판 패턴 채우기: (r+c) 짝수 => '#', 홀수 => '.'
    for(int r = 0; r < H; ++r){
        for(int c = 0; c < W; ++c){
            g[r][c] = (( (r + c) & 1 ) ? '.' : '#');
        }
    }

    // 원래 퍼즐을 (U, L) 위치부터 오버레이
    for(int i = 0; i < M; ++i){
        string s; cin >> s; // 길이 N
        for(int j = 0; j < N; ++j){
            g[U + i][L + j] = s[j];
        }
    }

    for(int r = 0; r < H; ++r){
        cout << g[r] << '\n';
    }
    return 0;
}

'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글

[Silver V] (중략) - 21966  (0) 2025.12.31
[Silver V] Potato - 28464  (0) 2025.12.31
[Silver V] 또 수열 문제야 - 31229  (0) 2025.12.29
[Silver V] 부울 행렬의 곱 - 14492  (0) 2025.12.23
[Silver V] 미아 노트 - 20114  (0) 2025.12.21