본문 바로가기

코딩테스트/JAVA

[백준 JAVA] 1074번: Z

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

 

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

public class Main {
	static StringTokenizer st;

	static long N, R, C, ans = 0;

	public static void main(String[] args) throws IOException {

	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    StringTokenizer st = new StringTokenizer(br.readLine());
	    
	    N = Integer.parseInt(st.nextToken());
	    R = Integer.parseInt(st.nextToken());
	    C = Integer.parseInt(st.nextToken());
	    
	    z(N, R, C);
	    
	    System.out.println(ans);  // 결과 출력
	}

	private static void z(long N, long R, long C) {
		if(N == 0) {
			return;
		}
		
		long X = (long) Math.pow(2, N);
	//	System.out.print(X + " ");
		if(R < X / 2 && C < X / 2) { // 1번째
		} else if(R < X / 2 && C >= X / 2) { // 2번째
			C -= X / 2;
			ans += ((X/2) * (X/2));
		}else if(R >= X / 2 && C < X / 2) { // 3번쨰
			R -= X / 2;
			ans += ((X/2) * (X/2)) * 2;
		}else { // 4번째
			R -= X / 2;
			C -= X / 2;
			ans += ((X/2) * (X/2)) * 3;
		}
		
	//	System.out.println(ans);
		
		z(N-1, R, C);
	}
}

 

## 풀이사항
풀이 일자: 2024.10.23
풀이 시간: 30분 + 30초
채점 결과: 정답
예상 문제 유형: 분할정복
시간: 108ms

## 풀이방법
1. 맵을 4등분 하고 1사분면, 2사분면, 3사분면, 4사분면이라 생각을 한다.
2. 각각의 사분면에 좌표가 위치해 있는 케이스마다 각각의 값을 ans의 더해준다.
3. 또한 각각의 사분면에서 다시 작은값으로 재귀해야되기 때문에 R, C값을 조정해준다.

30분 고민해서 안풀려서 다음날 봤는데 30초만에 풀었다. 

'코딩테스트 > JAVA' 카테고리의 다른 글

[프로그래머스 JAVA] 지형 이동  (0) 2024.10.30
[백준 JAVA] 18429번: 근손실  (0) 2024.10.25
[백준 JAVA] 4179번: 불!  (0) 2024.10.22
[백준 JAVA] 17281번: ⚾  (1) 2024.10.18
[백준 JAVA] 9370번: 미확인 도착지  (0) 2024.10.16