코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/SWEA

[SWEA] 2382번 : 미생물 격리

2024. 1. 28. 15:37

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

 

입력

 

출력

 


 소스코드

import java.util.*;
import java.io.*;

class Main {
    static int n; //셀의 개수
    static int m; //격리 시간
    static int k; //미생물 군집의 개수
    static Node[][] arr;

    static class Node {
        int di; //방향 (상: 1, 하: 2, 좌: 3, 우: 4)
        int size; //개수

        public Node(int di, int size) {
            this.di = di;
            this.size = size;
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            m = Integer.parseInt(st.nextToken());
            k = Integer.parseInt(st.nextToken());

            arr = new Node[n][n];
            for (int j = 0; j < k; j++) {
                st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                int size = Integer.parseInt(st.nextToken());
                int di = Integer.parseInt(st.nextToken());

                arr[x][y] = new Node(di, size);
            }

            for (int j = 0; j < m; j++) move();

            long result = 0;
            for (int j = 0; j < n; j++) {
                for (int l = 0; l < n; l++) {
                    if (arr[j][l] != null) {
                        result += arr[j][l].size;
                    }
                }
            }

            sb.append("#" + (i + 1) + " " + result + "\n");
        }
        System.out.println(sb);
    }

    static int[] rx = {0, -1, 1, 0, 0};
    static int[] ry = {0, 0, 0, -1, 1};

    //미생물 이동
    static void move() {
        Node[][] moveArr = new Node[n][n];
        int[][] sizeArr = new int[n][n]; //영역별 미생물 개수

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (arr[i][j] != null) {
                    Node curNode = arr[i][j];
                    int nx = i + rx[curNode.di];
                    int ny = j + ry[curNode.di];

                    //약품 영역
                    if (nx <= 0 || ny <= 0 || nx >= n - 1 || ny >= n - 1) {
                        curNode.size /= 2;
                        if (curNode.size == 0) continue;
                        if (curNode.di % 2 == 0) curNode.di -= 1;
                        else curNode.di += 1;
                    }

                    //미생물 합치기
                    if (moveArr[nx][ny] != null) {
                        //현재 미생물의 군집이 더 큰 경우
                        if (moveArr[nx][ny].size < curNode.size) {
                            moveArr[nx][ny].di = curNode.di;
                            moveArr[nx][ny].size = curNode.size;
                        }
                    } else moveArr[nx][ny] = curNode;

                    sizeArr[nx][ny] += curNode.size;
                }
            }
        }

        //영역별 미생물 개수 갱신
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(moveArr[i][j] != null) {
                    moveArr[i][j].size = sizeArr[i][j];
                }
            }
        }

        arr = moveArr;
    }
}

 

해결 방법

1. 군집 내 미생물의 수, 이동 방향을 저장하는 Node 클래스를 생성하였다.

2. 이동을 위한 move()를 작성하였고 약품 영역, 미생물 합치기와 같은 조건을 해결했다. 이때, 미생물이 있는 arr[][]과는 별개로 이동한 미생물을 저장하는 moveArr[][]을 두었다. 이렇게 해야 이미 이동한 미생물임을 판단할 수 있다.

3. 주의 사항으로 3개 이상의 군집이 한 영역으로 오는 경우 가장 수가 많은 군집의 방향으로 설정하기 위해 미생물 합계는 따로 sizeArr[][]을 두어 관리하였다.

 

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 1284번 : 수도 요금 경쟁  (1) 2023.11.16
[SWEA] 1952번 : 수영장  (1) 2023.11.16
[SWEA] 7272번 : 안경이 없어!  (0) 2023.11.10
[SWEA] 2105번 : 디저트 카페  (0) 2023.11.09
[SWEA] 1953번 : 탈주범 검거  (0) 2023.11.08
    '알고리즘/SWEA' 카테고리의 다른 글
    • [SWEA] 1284번 : 수도 요금 경쟁
    • [SWEA] 1952번 : 수영장
    • [SWEA] 7272번 : 안경이 없어!
    • [SWEA] 2105번 : 디저트 카페
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바