[ 백준 17144 ] 미세먼지 안녕! (C++) - 구현

2024. 3. 6. 18:05· 문제풀이/알고리즘 문제 풀이
목차
  1. 🔗 문제 링크
  2. 💡 문제 풀이 및 해석
  3. ⭐️ 정답 코드 및 설명
  4. 🤔 문제 후기
728x90

🔗 문제 링크

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net


💡 문제 풀이 및 해석

  1. 공기가 한 번에 다 퍼지게 해야된다. 따라서 모든칸에서 퍼지게 해야되므로 모든 칸에서 로직이 작동되게 해야된다.
  2. 현재 칸에서 퍼지게하고, 다음칸을 퍼지게하면, 이미 먼지가 퍼진 상태에서 로직이 실행되므로 먼지가 퍼지는 배열을 따로 만들어줘야 한다.
  3. 먼지가 다 퍼지면, 공기가 순환되게 해야된다. 이 때, 공기청정기로 들어오는 방향으로 1칸씩 땡기고, 공기청정기에서 나오는 칸만 0으로 처리해주면 된다.
  4. 마지막으로 모든 칸의 먼지를 다 더해주면 된다.

⭐️ 정답 코드 및 설명

#include<iostream>
#include<vector>
#define endl "\n"
using namespace std;

int R, C, T;
int next_x[] = { -1,1,0,0 };
int next_y[] = { 0,0,1,-1 };
int MAP[51][51];
int S_MAP[51][51];
int d_start;

void input() {
    cin >> R >> C >> T;
    for (int y = 1; y <= R; y++) {
        for (int x = 1; x <= C; x++) {
            cin >> MAP[y][x];
            if (MAP[y][x] == -1) d_start = y;
        }
    }
}

void Spread(int y, int x) {
    int cnt = 0;
    int sp = MAP[y][x] / 5; // 퍼질 양
    for (int i = 0; i < 4; i++) {
        int nx = x + next_x[i];
        int ny = y + next_y[i];
        if (ny > 0 && ny <= R && nx > 0 && nx <= C) { // 범위 안에 있고
            if (MAP[ny][nx] != -1) { // 공기 청정기가 아니면
                S_MAP[ny][nx] += sp;
                cnt++; // 퍼진 수
            }
        }
    }
    MAP[y][x] -= (sp * cnt); // 퍼진 양 * 퍼진 칸
}

void u_Wind(int x, int y) {

    for (int Y = d_start - 2; Y > 1; Y--)
        MAP[Y][1] = MAP[Y - 1][1];
    for (int X = 1; X < C; X++)
        MAP[1][X] = MAP[1][X + 1];
    for (int Y = 1; Y < d_start - 1; Y++)
        MAP[Y][C] = MAP[Y + 1][C];
    for (int X = C; X > 2; X--)
        MAP[d_start - 1][X] = MAP[d_start - 1][X - 1];

    MAP[d_start - 1][2] = 0;
}

void d_Wind(int x, int y) {

    for (int Y = d_start + 1; Y < R; Y++)
        MAP[Y][1] = MAP[Y + 1][1];
    for (int X = 1; X < C; X++)
        MAP[R][X] = MAP[R][X + 1];
    for (int Y = R; Y > d_start; Y--)
        MAP[Y][C] = MAP[Y - 1][C];
    for (int X = C; X > 2; X--)
        MAP[d_start][X] = MAP[d_start][X - 1];

    MAP[d_start][2] = 0;
}

void sol() {
    while (T--) { // T초 반복

        // 모든 칸에서 확산
        for (int y = 1; y <= R; y++) {
            for (int x = 1; x <= C; x++) {
                if (MAP[y][x] == 0 || MAP[y][x] == -1) continue;
                Spread(y, x);
            }
        }

        for (int y = 1; y <= R; y++) {
            for (int x = 1; x <= C; x++) {
                MAP[y][x] += S_MAP[y][x];
                S_MAP[y][x] = 0;
            }
        }

        // 공기 청정기 위,아래
        u_Wind(0, d_start - 1);
        d_Wind(0, d_start);
    }

    int answer = 0;
    for (int y = 1; y <= R; y++) {
        for (int x = 1; x <= C; x++) {
            answer += MAP[y][x];
        }
    }
    cout << answer + 2;
}
int main() {
    ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
    input();
    sol();
    return 0;
}

🤔 문제 후기

문제를 풀면서 처음에는 공기가 순환하는 방향으로 계산했는데, 반대로 하면 간단하다는 것을 중간에 알았다. 그 외에는 먼지가 퍼지는 S_MAP을 생각하는데 시간이 조금 걸리긴 했지만, 전체적으로 시간은 15~25분 내로 풀 수 있던 문제였다.

728x90
저작자표시 비영리 동일조건 (새창열림)

'문제풀이 > 알고리즘 문제 풀이' 카테고리의 다른 글

[ 백준 14502 ] 연구소 (C++) - BFS  (0) 2024.03.08
[ 백준 21608 ] 상어 초등학교 (C++) - 구현, BruteForce  (0) 2024.03.06
[ 백준 14503 ] 로봇 청소기 (C++) - 구현  (0) 2024.03.06
[ 백준 1405 ] 미친 로봇 (C++) - DFS  (0) 2024.03.05
[ 프로그래머스 ] 다단계 칫솔 판매 (C++) - 구현  (2) 2024.03.05
  1. 🔗 문제 링크
  2. 💡 문제 풀이 및 해석
  3. ⭐️ 정답 코드 및 설명
  4. 🤔 문제 후기
'문제풀이/알고리즘 문제 풀이' 카테고리의 다른 글
  • [ 백준 14502 ] 연구소 (C++) - BFS
  • [ 백준 21608 ] 상어 초등학교 (C++) - 구현, BruteForce
  • [ 백준 14503 ] 로봇 청소기 (C++) - 구현
  • [ 백준 1405 ] 미친 로봇 (C++) - DFS
RealTone
RealTone
풀스택 개발자되기 기원 1년차
개발공부 블로그풀스택 개발자되기 기원 1년차
RealTone
개발공부 블로그
RealTone
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발자 공부 (8)
      • 인프라 - AWS (2)
      • Frontend - React (2)
      • Frontend - Next (2)
    • 구름톤트레이닝 (2)
      • 강의 후기 (0)
    • 문제풀이 (74)
      • 알고리즘 문제 풀이 (62)
      • SQL 문제 풀이 (12)
    • 개인 (0)
      • 멕북초기화세팅 (0)

블로그 메뉴

  • 홈
  • 태그
  • GitHub
  • 방명록

태그

  • AWS
  • baekjoon
  • CI/CD
  • codedeploy
  • ec2
  • G2
  • G3
  • G4
  • G5
  • git/github

최근 글

hELLO · Designed By 정상우.v4.2.2
RealTone
[ 백준 17144 ] 미세먼지 안녕! (C++) - 구현
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.