일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- linux
- Spring JPA
- 프로그래머스
- MYSQL
- 자바
- java
- 백준
- c
- 회원가입
- C++
- Computer Science
- SWEA
- python
- modern c++
- Gem
- Spotify Api
- SECS
- SECS/GEM
- CS
- programmers
- Spring
- regression
- spotify
- SECS-II
- 파이썬
- SW Expert Academy
- 회귀
- Baekjoon
- 스포티파이
- spring boot
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 1074 Z 본문
728x90
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.
만약, N > 1이 라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.
다음 예는 22 × 22 크기의 배열을 방문한 순서이다.
N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.
다음은 N=3일 때의 예이다.
위와같이 N=2 r=3 c=1 로 입력이 들어간다. N은 배열의 크기로 2^N의 배열이 들어간다. 그렇게 만들어진 배열에서 3행 1열에 방문하게되는 횟수를 출력해 줘야한다.
그런데 방문하는 방식이 Z라는 모양으로 방문해야 하는데, 재귀 방식을 이용을 해서 만들어 준다.
배열을 반씩 나누어 배열이 2*2가 되었을 때 값을 입력값과 위치가 같아진다면 그때의 값을 출력해 준다.
import java.util.Scanner;
public class Main {
public static int row;
public static int col;
public static int[] dx = {0, 0, 1, 1};
public static int[] dy = {0, 1, 0, 1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int pow = sc.nextInt();
int size = (int) Math.pow(2, pow);
row = sc.nextInt();
col = sc.nextInt();
find(0, 0, 0, size);
sc.close();
}
public static void find(int x,int y, int cnt, int size) {
// 확인하고자 하는 row와 col 좌표가 y <= row < y+size, x <= col < x+size 범위 에 해당되지 않으면 구할 필요 없다.
if(x > row || x+size <= row || y > col || y+size <= col) return;
if(size == 2) {
for(int i=0; i < 4; i++) {
int xx = dx[i] + x;
int yy = dy[i] + y;
if(xx == row && yy == col) System.out.println(cnt + i);
}
return;
}
int newSize = size/2;
find(x,y, cnt, newSize);
find(x, y+newSize, cnt+(newSize*newSize), newSize);
find(x+newSize, y, cnt+(newSize*newSize*2), newSize);
find(x+newSize, y+newSize, cnt+(newSize*newSize*3), newSize);
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 1157 단어 공부 (0) | 2021.01.10 |
---|---|
[BAEKJOON 백준] 1110 더하기 사이클 (0) | 2021.01.10 |
[BAEKJOON 백준] 1032 명령 프롬프트 (0) | 2021.01.10 |
[BAEKJOON 백준] 1008 A/B (0) | 2021.01.10 |
[BAEKJOON 백준] 1001 A-B (0) | 2021.01.10 |
Comments