[백준 BOJ] 10709번 기상캐스터 (C++/cpp)

2024. 3. 7. 17:44PS (Program Solving)/BOJ (백준)

문제 설명

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

 

10709번: 기상캐스터

출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시

www.acmicpc.net

백준 BOJ 10709번 기상캐스터 문제 사진1
백준 BOJ 10709번 기상캐스터 문제 사진2

 

접근 방법 - 시뮬레이션을 통한 수학 구현 문제

백준의 10709번 문제는 시뮬레이션을 통하여 해결해야 하는 수학적인 구현 문제이다.

해당 문제는, 현재의 각 구름 위치 좌표가 입력으로 주어질 때 각 좌표에 몇 초 뒤 구름이 지나갈지에 대하여 출력해야 하는 문제이다.

시뮬레이션이란, 문제에서 제시한 조건들을 기반으로 가상으로 예측해 보며 알고리즘을 구축하는 방식을 의미한다.

이 문제와 같은 경우에는 구름이 각 시간마다 이동하는 장면을 상상하면서 코드를 구축하면 된다.

문제의 하단에도 설명이 잘 되어있지만, 필자도 아래처럼 그림을 그려보았다.

백준 BOJ 10709번 기상캐스터 문제 설명

문제에서, 구름은 1초에 동쪽으로 한 칸씩 이동한다고 명시되어 있다.
그렇기 때문에 "c"의 왼편으로는 구름이 갈 일이 없으니 -1 값을 고정으로 갖게 될 것이다.
그 반대로 "c"의 오른편으로는 구름이 한 칸씩 점진적으로 다가올 것이기 때문에 양수의 값을 갖게 될 것이다.
이때, 출력도 왼쪽에서 오른쪽으로 수행될 것이기 때문에 "c"를 입력받은 시점부터 하여 값을 1씩 늘려가면서 각 좌표의 정답값으로 설정하였다.

자세한 내용은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 구름의 위치를 저장할 배열 cloud를 전역 변수로 미리 선언해 둔다.

 

2) 전체 좌표의 행과 열(n, m) 길이를 입력받는다.

 

3) 정답을 저장할 배열 time을 선언해 둔다.

 

4) 행의 총길이인 n의 크기만큼, 반복문을 수행하여 아래의 연산을 수행한다.

- 현재 행에 대하여 입력을 받는다.

- 각 좌표에 대한 정답을 저장할 때 사용할 변수 cnt를 -1로 초기화하며 선언한다.

- 현재 행의 요소들을 반복문으로 순차적으로 탐색하며 연산을 수행한다.

  • 만약 현재까지 "c"가 나타나지 않았다면, 아무 연산을 수행하지 않고 -1인 현재 cnt의 값을 해당 좌표의 정답으로 저장하도록 한다.
  • 다만 "c"가 한번 나타났다면, 즉시 cnt 값을 0으로 바꾸고 그 이후부터 계속 cnt에 1씩 더해가도록 한다. 그리고 이 cnt 값을 해당 좌표의 정답으로 저장하도록 한다.

 

5) 4)의 연산을 모두 완료하였다면, 현재 저장되어 있던 time의 값들을 형식에 맞게 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 10709번 코드
string cloud[101];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);   cout.tie(NULL);

    int n, m;
    cin >> n >> m;

    int time[101][101];
    for (int i = 0; i < n; i++) {
        cin >> cloud[i];

        int cnt = -1;
        for (int j = 0; j < m; j++) {
            if (cloud[i][j] == 'c') {
                cnt = 0;
            }
            else if (cnt != -1) { cnt++; }

            time[i][j] = cnt;
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << time[i][j] << " ";
        }
        cout << endl;
    }
}

 

제출 결과

백준 BOJ 10709번 기상캐스터 문제 C++ 제출 결과

(2024.01.30 백준 10709번 문제 제출 결과)

반응형