1. 유형 : 구현
2. 설명 : 흔한 달팽이 문제다. 시작좌표를 설정하고, 동서남북의 바운더리를 설정해준다.
밑에 그림처럼 처음엔 파랑색, 노랑색, 녹색, 보라색 순으로 한 사이클을 탐색한다.
저것을 target을 찾을 때까지 반복한다.
3. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 자리배정10157 {
static int w,h,k;
public static void main(String[] args) throws IOException {
init();
go();
}
static void init() throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
w=Integer.valueOf(st.nextToken());
h=Integer.valueOf(st.nextToken());
k=Integer.valueOf(in.readLine());
}
//바운더리를 설정
static void go() {
int cnt = 1;
int sx = 1;
int sy = 1;
int a = h, b=w, c=1, d=2;
if(h*w<k) {
System.out.println(0);
return;
}
out:while(true) {
//상
for (int i = sy; i < a; i++) {
if(cnt==k) break out;
else if(cnt<k) {
cnt++;
sy++;
}
}
a--;
for (int j = sx; j < b; j++) {
if(cnt==k) break out;
else {
cnt++;
sx++;
}
}
b--;
for (int i = sy; i > c ; i--) {
if(cnt==k) break out;
else {
cnt++;
sy--;
}
}
c++;
for (int j = sx; j > d; j--) {
if(cnt==k) break out;
else {
cnt++;
sx--;
}
}
d++;
}
System.out.println(sx+" "+sy);
}
}
시작위치와 동서남북 바운더리 설정
int cnt = 1;
int sx = 1;
int sy = 1;
int a = h, b=w, c=1, d=2;
문제에서 처음은 위로 증가하도록 되어있다. 높이가 6이라면 5까지만 갈 수 있음
(바운더리 설정)
//상
for (int i = sy; i < a; i++) {
if(cnt==k) break out;
else if(cnt<k) {
cnt++;
sy++;
}
}
a--;
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2116] 골드5 - 주사위 쌓기 (0) | 2020.09.26 |
---|---|
[백준 14002] 골드4 - 가장 긴 증가하는 부분수열4 (0) | 2020.09.24 |
[백준 1405] 미친 로봇 (0) | 2020.08.15 |
백준 16234 인구 이동 (0) | 2020.03.13 |
백준 15686 치킨 배달 (0) | 2020.03.13 |