Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 2630๋ฒˆ - ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ

giraffe_ 2022. 8. 7. 00:50

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

 

2630๋ฒˆ: ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์—๋Š” ์ „์ฒด ์ข…์ด์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์ ธ ์žˆ๋‹ค. N์€ 2, 4, 8, 16, 32, 64, 128 ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ƒ‰์ข…์ด์˜ ๊ฐ ๊ฐ€๋กœ์ค„์˜ ์ •์‚ฌ๊ฐํ˜•์นธ๋“ค์˜ ์ƒ‰์ด ์œ—์ค„๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ค„๊นŒ์ง€ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

 

 

 

 

๋”ฑ ๋ด๋„ ์žฌ๊ท€๋ฅผ ์“ฐ๋Š” ๋ถ„ํ• ์ •๋ณต ์œ ํ˜•์˜ ๋ฌธ์ œ์ด๋‹ค. ์˜ˆ์ „์— ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ํ‘ผ ์ ์ด ์žˆ์–ด์„œ ๊ธˆ๋ฐฉ ํ’€์—ˆ๋‹ค.

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

 

1780๋ฒˆ: ์ข…์ด์˜ ๊ฐœ์ˆ˜

N×Nํฌ๊ธฐ์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ข…์ด์˜ ๊ฐ ์นธ์—๋Š” -1, 0, 1 ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ํ–‰๋ ฌ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ž๋ฅด๋ ค๊ณ  ํ•œ๋‹ค. ๋งŒ์•ฝ ์ข…์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜

www.acmicpc.net

 

 

 

 

 

1. ์žฌ๊ท€์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐฐ์—ด, ์‹œ์ž‘์ ์˜ ์ขŒํ‘œ, ์ข…์ด์˜ ํฌ๊ธฐ๋ฅผ ๋„ฃ์—ˆ๋‹ค.

2. ์žฌ๊ท€ ๋ฉ”์†Œ๋“œ์˜ ์•ˆ์—์„œ ์šฐ์„  ๋ชจ๋‘ ๊ฐ™์€ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€(๊ฐ™์€ ์ƒ‰์˜ ์ข…์ด์ธ์ง€) ํ™•์ธ์„ ํ•ด์ค€๋‹ค.

3. ๊ฐ™์œผ๋ฉด ์ข…์ด ์ƒ‰์— ๋”ฐ๋ผ ์นด์šดํŠธ๋ฅผ ์˜ฌ๋ฆฌ๊ณ , ๋‹ค๋ฅด๋ฉด 4๊ฐœ๋กœ ๋ถ„ํ• ํ•ด์„œ ๊ฐ ์‹œ์ž‘์ ์˜ ์ขŒํ‘œ๊ฐ’๊ณผ 1/2๋กœ ์ข…์ด์˜ ํฌ๊ธฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด ์žฌ๊ท€๋ฅผ ๋Œ๋ฆฐ๋‹ค. 

 

 

 

 

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int white = 0;
	static int blue = 0;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[][] paper = new int[N][N];
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			for(int j = 0; j < N; j++) {
				paper[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		divide(paper, 0, 0, N);
		
		System.out.println(white);
		System.out.println(blue);
	}

	public static void divide(int[][] paper, int a, int b, int n) {
		if(isSame(paper, a, b, n)) {
			if(paper[a][b] == 0) {
				white++;
			}else {
				blue++;
			}
			return;
		}else {
			divide(paper, a, b, n / 2);
			divide(paper, a, b + n / 2, n / 2);
			divide(paper, a + n / 2, b, n/2);
			divide(paper, a + n / 2, b + n / 2, n/2);
		}
		
	}

	public static boolean isSame(int[][] paper, int a, int b, int n) {
		int num = paper[a][b];
		for(int i = a; i < a + n; i++) {
			for(int j = b; j < b + n; j++) {
				if(paper[i][j] != num) {
					return false;
				}
			}
		}
		return true;
	}
}

 

 

 

 

 

 

๊ฒฐ๊ณผ