728x90
시뮬레이션 기본 문제.
여기서 고려해야 할 부분은 이미 값을 체크한 부분은 가지 않게 boolean형 visit이차원 배열을 선언해서 이용했으며
관객에게 좌석을 배정할수 없을 경우는 k가 행*열 을 넘은 경우이다
문제 풀이
- k값을 입력받아 행*열 을 넘지 않으면 시작한다.
- count가 k가 될 때까지 계속 이동한다. 이동할 때 방문했거나 범위를 벗어나면 다음 방향으로 이동해준다.
- count 가 k값이 될 때 그 위치가 범위 안에 존재한다면 출력해주고 아니면 방향만큼 뒤로 갔다가 다음 방향으로 이동
이 분홍색 부분이 3번을 처리 한 부분이다.
전체 코드
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main{
static boolean map[][];
static int c, r, k, dir[][] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }, now = 0, resultx, resulty;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
c = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
map = new boolean[c][r];
k = Integer.parseInt(br.readLine());
if (k <= r * c) {
go();
if (resultx < 0 || resultx >= c || resulty < 0 || resulty >= r
|| map[resultx][resulty]) {
resultx -= dir[now][0];
resulty -= dir[now][1];
now = (now + 1) % 4;
resultx += dir[now][0];
resulty += dir[now][1];
}
System.out.print(resultx + 1 + " ");
System.out.println(resulty + 1);
}
else {
System.out.println(0);
}
}
private static void go() {
// TODO Auto-generated method stub
int count = 1;
while (count < k) {
map[resultx][resulty] = true;
resultx += dir[now][0];
resulty += dir[now][1];
if (resultx < 0 || resultx >= c || resulty < 0 || resulty >= r || map[resultx][resulty]) {
resultx -= dir[now][0];
resulty -= dir[now][1];
now = (now + 1) % 4;
resultx += dir[now][0];
resulty += dir[now][1];
}
count++;
}
}
}
'IM대비' 카테고리의 다른 글
백준 2635 <수 이어가기> (0) | 2020.09.20 |
---|---|
백준 2669 <직사각형 네개의 합집합의 면적 구하기> (0) | 2020.09.20 |
백준 2564 <경비원> (0) | 2020.09.20 |
백준 2477 <참외밭> (0) | 2020.09.19 |
백준 2491 <수열> (0) | 2020.09.19 |