Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 백준 4358번
- 스터디
- 문자열
- 리액트 네이티브 프로젝트 생성
- HTTP
- 깃 연동
- 데이터베이스
- 백준 4358 자바
- 지네릭스
- 깃허브 로그인
- 모두를 위한 딥러닝
- 깃 터미널 연동
- 딥러닝
- 데베
- 리액트 네이티브
- 모두의 네트워크
- React Native
- 모두의네트워크
- 네트워크
- 백준
- 백준 5525번
- 자바
- 리액트 네이티브 시작하기
- 모두를위한딥러닝
- 팀플회고
- 백준 4949번
- 정리
- SQL
- 머신러닝
- 깃허브 토큰 인증
Archives
- Today
- Total
솜이의 데브로그
백준 2630번 ) 색종이 만들기 (java) 본문
https://www.acmicpc.net/problem/2630
문제
풀이
이 문제는 분할정복 문제였다. 재귀적으로 함수를 호출하면서 해당하는 영역이 모두 같은색인지 확인하는 방식으로 진행하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BOJ_2630 {
public static int[][] paper;
public static int white = 0;
public static int blue = 0;
public static void solution(int row, int col, int size){
if(colorCheck(row, col, size)){
if(paper[row][col] == 0) white++;
else blue++;
return;
}
int newSize = size / 2;
solution(row, col, newSize);
solution(row, col + newSize, newSize);
solution(row + newSize, col, newSize);
solution(row + newSize, col + newSize, newSize);
}
public static boolean colorCheck(int row, int col, int size){
int color = paper[row][col];
for(int i = row; i < row+size; i++) {
for(int j = col; j < col+size; j++){
if(paper[i][j] != color) return false;
}
}
return true;
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
paper = new int[N][N];
StringTokenizer st;
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < N; j++){
paper[i][j] = Integer.parseInt(st.nextToken());
}
}
solution(0, 0, N);
System.out.println(white);
System.out.println(blue);
}
}
- main에서는 BufferedReader를 이용하여 배열을 읽어오고 저장한 후, solution 함수를 호출한다.
- solution 함수에서는 사이즈에 따른 영역만큼 해당하는 영역이 모두 같은 색으로 되어있는지 확인 후, colorCheck가 true라면 해당하는 색의 카운트를 올린다. 같은색으로 되어있지 않다면 영역을 2씩 나누어 다시 재귀적으로 solution 함수를 호출한다. (이는 N이 2의 제곱이라 가능함.)
- colorCheck 함수에서는 첫 타일의 색과 나머지 사이즈까지의 색이 같은지 비교하여 true 또는 false를 반환한다.
궁금한점
이것보다 효율적인 방법으로 풀 수 있을까??
'Algorithm > 백준' 카테고리의 다른 글
백준 2748번 ) 피보나치 수 2 (java) (0) | 2022.02.24 |
---|---|
백준 2231번 ) 분해합 (java) (0) | 2022.02.24 |
백준 1874번 ) 스택 수열 (java) (0) | 2022.02.22 |
백준 11047번 ) 동전 0 (java) (0) | 2022.02.22 |
백준 4358번 ) 생태학 (java) (0) | 2021.10.08 |