본문 바로가기
코딩테스트

17144.cpp - 미세먼지 안녕!

by swthewhite 2023. 10. 10.
#include <iostream>
#include <vector>
using namespace std;

int r, c, t;
int graph[51][51];
int change[51][51];

int my;

int left()
{
    int ans = 0;
    for (int y = 0; y < r; y++)
    {
        for (int x = 0; x < c; x++)
        {
            // printf(" %2d", graph[y][x]);
            if (graph[y][x] > 0)
            {
                ans += graph[y][x];
            }
        }
        // printf("\n");
    }
    return ans;
}

void airclean()
{
    int mx = 0;

    // top
    for (int y = my - 3; y >= 0; y--)
    {
        graph[y + 1][0] = graph[y][0];
    }
    for (int x = 1; x < c; x++)
    {
        graph[0][x - 1] = graph[0][x];
    }
    for (int y = 1; y < my; y++)
    {
        graph[y - 1][c - 1] = graph[y][c - 1];
    }
    for (int x = c - 2; x > 0; x--)
    {
        graph[my - 1][x + 1] = graph[my - 1][x];
    }
    graph[my - 1][1] = 0;

    // bottom
    for (int y = my + 2; y < r; y++)
    {
        graph[y - 1][mx] = graph[y][mx];
    }
    for (int x = 1; x < c; x++)
    {
        graph[r - 1][x - 1] = graph[r - 1][x];
    }
    for (int y = r - 2; y >= my; y--)
    {
        graph[y + 1][c - 1] = graph[y][c - 1];
    }
    for (int x = c - 2; x > 0; x--)
    {
        graph[my][x + 1] = graph[my][x];
    }
    graph[my][mx + 1] = 0;
}

int dy[4] = {-1, 1, 0, 0};
int dx[4] = {0, 0, -1, 1};

void extend()
{
    int addnum;
    int ny, nx;

    for (int y = 0; y < r; y++)
    {
        for (int x = 0; x < c; x++)
        {
            if (graph[y][x] > 0)
            {
                addnum = graph[y][x] / 5;

                int cnt = 0;
                for (int j = 0; j < 4; j++)
                {
                    ny = y + dy[j];
                    nx = x + dx[j];
                    if (ny >= r || ny < 0 || nx >= c || nx < 0)
                        continue;
                    if (graph[ny][nx] == -1)
                        continue;
                    change[ny][nx] += addnum;
                    cnt += 1;
                }
                change[y][x] -= (cnt * addnum);
            }
        }
    }

    for (int y = 0; y < r; y++)
    {
        for (int x = 0; x < c; x++)
        {
            graph[y][x] += change[y][x];
            change[y][x] = 0;
        }
    }
}

void solution()
{
    cin >> r >> c >> t;
    for (int y = 0; y < r; y++)
    {
        for (int x = 0; x < c; x++)
        {
            cin >> graph[y][x];
            if (graph[y][x] == -1)
                my = y;
        }
    }
    for (int i = 0; i < t; i++)
    {
        extend();
        airclean();
    }
    cout << left();
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    solution();
    return 0;
}

마주한 실수

1. 흐름 반대로 풀기

- 위에서 아래로 풀어야 하는데

- 반대로 풀었다가

- 문제가 생겼을 때

- 문제의 정확한 위치를 찾는데 오래걸렸음....

 

2. 기호화 부족

- 설계 그림을 대충 그려서

- 보다가 혼동와서 구현 과정에서 다르게 구현함

- 설계도는 본인이 정한 규칙에 맞게 제대로 기호화하자

 

3. 여러 초기화 시점이 있음을 인지 못함

- 매턴마다 미세먼지의 위치는 바뀌는데

- 그걸 생각 못하고

- 위치 저장을 맨처음 한 번만 해버림

=> 효율 찾으려다, 헛짓해버린 것

'코딩테스트' 카테고리의 다른 글

13460.cpp - 구슬 탈출 2  (1) 2023.10.10
C++로 코테를?  (1) 2023.10.10

댓글