[BOJ/백준] 1780 종이의 개수 (S2)

2024. 8. 9. 18:23· Algorithm PS/Baekjoon Online Judge
목차
  1. 문제
  2. 풀이
  3. Code

문제

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

풀이

색종이의 수가 모두 같은 수라면 이 색종이를 그대로 사용하지만 좌측의 그림과 같이 모두 같은 수가 아니라면 우측 그림처럼 9등분을 한다.

현재는 row와 column 모두 9이므로 9등분을 하면 나눠진 색종이의 size는 이전의 size/3이 되어 3이 된다.

나누어진 색종이를 좌표로 표현해보면 위와 같이 표현할 수 있다.

N이 9 일 때의 결과를 보면 위 그림과 같이 나오는 것을 알 수 있다.

Code

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

public class Main {

    static int N;
    static int [][] arr;
    static int [] answer = new int[3];  // -1, 0, 1


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        cut(0, 0, N);
        for (int i = 0; i < 3; i++) {
            bw.write(answer[i] + "\n");
        }
        bw.flush();
        bw.close();
    }

    public static void cut(int x, int y, int size) {
        // 다 같은 숫자면 더하기
        if (numCheck(x, y, size)) {
            if (arr[x][y] == -1) {
                answer[0]++;
            } else if (arr[x][y] == 0) {
                answer[1]++;
            } else {
                answer[2]++;
            }
        } else {  // check가 false면? (다른 숫자가 포함되어 있으면) ->  9분할 진행
            int newSize = size / 3;

            // 왼쪽 위부터 오른쪽 아래로 cut()를 진행하며 분할을 진행
            cut(x, y, newSize);  // 1
            cut(x, y + newSize, newSize);  // 2
            cut(x, y + newSize * 2, newSize);  // 3

            cut(x + newSize, y, newSize);  // 4
            cut(x + newSize, y + newSize, newSize);  // 5
            cut(x + newSize, y + newSize * 2, newSize);  // 6

            cut(x + newSize * 2, y, newSize);  // 7
            cut(x + newSize * 2, y + newSize, newSize);  // 8
            cut(x + newSize * 2, y + newSize * 2, newSize);  // 9
        }
    }

    public static boolean numCheck(int x, int y, int size) {
        int start = arr[x][y];
        boolean check = true;
        for (int i = x; i < x + size; i++) {
            for (int j = y; j < y + size; j++) {
                // start(시작점)와 각 칸에 표기된 수를 비교하여 다르면 false를 반환
                if (start != arr[i][j]) {
                    check = false;
                    break;
                }
            }
        }
        return check;
    }
}

728x90

'Algorithm PS > Baekjoon Online Judge' 카테고리의 다른 글

[BOJ/백준] 곱셈 (S1)  (0) 2024.08.11
[BOJ/백준] 1074 Z (S1)  (0) 2024.08.10
[BOJ/백준] 11725 트리의 부모 찾기 (S2)  (1) 2024.07.23
[BOJ/백준] 2668 숫자고르기 (G5)  (0) 2024.07.23
[BOJ/백준] 24480 알고리즘 수업 - 깊이 우선 탐색 2 (S2)  (0) 2024.07.19
  1. 문제
  2. 풀이
  3. Code
'Algorithm PS/Baekjoon Online Judge' 카테고리의 다른 글
  • [BOJ/백준] 곱셈 (S1)
  • [BOJ/백준] 1074 Z (S1)
  • [BOJ/백준] 11725 트리의 부모 찾기 (S2)
  • [BOJ/백준] 2668 숫자고르기 (G5)
kyung.Kh
kyung.Kh
Dev..studynotekyung.Kh 님의 블로그입니다.
kyung.Kh
Dev..studynote
kyung.Kh
전체
오늘
어제
07-27 05:26
  • 분류 전체보기 (75)
    • Algorithm PS (32)
      • Baekjoon Online Judge (32)
      • Programmers (0)
    • Computer Science (8)
      • Databse (2)
      • Operating System (1)
      • Computer Network (0)
      • Computer Architecture (0)
      • Algorithm (4)
      • Java & Spring (1)
    • Spring (29)
      • Spring Boot (1)
      • 스프링 핵심 원리 - 기본편(인프런 김영한) (7)
      • Java (1)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
    • Project (2)
      • 문제 & 해결 (2)
    • Book (3)
      • 객체지향의 사실과 오해 (3)
    • 우하한테크코스 (1)
      • precourse (1)

최근 글

인기 글

블로그 메뉴

    태그

    • JPA
    • 재귀
    • Graph
    • 해시를 사용한 집합과 맵
    • 객체지향
    • 스프링 기본편
    • DP
    • 스프링부트
    • BFS
    • springboot
    • 인프런
    • 스프링 김영한
    • 구현
    • 알고리즘
    • Spring
    • 그리디
    • 백준
    • dfs
    • Union-Find
    • 스프링
    hELLO · Designed By 정상우.v4.2.2
    kyung.Kh
    [BOJ/백준] 1780 종이의 개수 (S2)
    상단으로

    티스토리툴바

    단축키

    내 블로그

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

    블로그 게시글

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

    모든 영역

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

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