Machineboy空

10709 : 기상캐스터 - if 조건부 구성 본문

Computer/Coding Test

10709 : 기상캐스터 - if 조건부 구성

안녕도라 2024. 2. 15. 16:02

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

 

10709번: 기상캐스터

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

www.acmicpc.net

문제요약

구름의 이동거리

 

난이도

Silver 5


풀이 포인트

  • 조건부 깔끔히 구성
    • 현재 칸에 구름이 있니?
    • 없다면 이전에 구름이 있었니?

아래 문자의 숫자니? 그러면 축적,  숫자가 아니니? 그럼 축적된게 있니? 로직과 비슷

https://machineboy0.tistory.com/172

 

2870 : 수학숙제 - stoi, 문자열기반 숫자 대소비교, custom operator

https://www.acmicpc.net/problem/2870 2870번: 수학숙제 종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차

machineboy0.tistory.com


REVIEW

 

쉽게 풀 수 있는 문제지만, 조건부를 머리 좋게 구성하는 법을 또 생각해야 했던 문제.

 

1. 나의 조건부 구성

  • 처음 cnt는 -1부터 시작
  • 첫칸이 구름이면 0으로 갱신
  • 다음부터는 현재칸이 구름이면 cnt 0으로 갱신, 이줄에 구름이 있음을 판단하는 hasCloud 플래그 변수 true
  • hasCloud가 true면 cnt++; 다시 구름을 만나면 0으로 갱신되는식.

뭔가 많이도 복잡하다.

gpt에게 깔끔하게 정리해달라고 했더니 플래그 변수를 일단 지워버리고 cnt가 -1인지로 이전에 구름이 있었는지를 체크하더라.

 

2. gpt의 조건부 구성

 

그래서 수학숙제 문제와 비슷한 조건부가 완성되었다.

  • 현재 칸이 구름이니? 그렇다면 cnt 0
  • 구름이 아니라면? cnt 가 -1이니? 즉 이전에 구름이 없었니? 그게 아니라면 cnt ++;

3. 모범답안 조건부 구성

 

우선 구름 배열을 0,1이 아닌 -1과 0으로 채워두고,

  • 현재칸이 구름이라면? 0을 만날 때 까지 즉 -1인 동안 cnt++ 해줌

 

쉬운 문제일 수록 다양하고 똑똑한 풀이법이 많은 것 같다. 조건부 깔끔하게 구성하는 법 고안하기!


CODE

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

int h, w, a[101][101], ret[101][101]; // ret 배열도 굳이 필요 없음 cnt를 바로 출력하면 됌.
char s;

int main()
{

    cin >> h >> w;

    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            cin >> s;
            if (s == 'c')
            {
                a[i][j] = 1;
            }
        }
    }


    for (int i = 0; i < h; i++)
    {
        int cnt = -1;

        for (int j = 0; j < w; j++)
        {
            if (a[i][j] == 1)
            {
                cnt = 0;
            }else if(cnt!=-1){
                cnt++;
            }

            ret[i][j] = cnt;
            cout << ret[i][j] << " ";
        }
        cout << '\n';
    }
}
#include <bits/stdc++.h>
using namespace std;
int n, m, a[104][104];
string s;
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> s;
        for (int j = 0; j < m; j++)
        {
            if (s[j] == '.')
                a[i][j] = -1;
            else
                a[i][j] = 0;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (a[i][j] == 0)
            {
                int cnt = 1;
                while (a[i][j + 1] == -1)
                {
                    a[i][j + 1] = cnt++;
                    j++;
                }
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
    return 0;
}