백준 1913번: 달팽이
문제 설명
- 2차원 배열을 원하는 순서대로 순회해 봅시다.
접근법
아래 -> 오른쪽 -> 위 -> 왼쪽 -> ...
의 움직임이 반복됩니다.- 4개가 반복되기 때문에 나머지 연산을 사용하면 효율적입니다.
- 방향을 바꾸는 경우는 다음과 같습니다.
- 다음 칸이 board를 벗어날 때
- 다음 칸에 0 이외의 숫자가 들어있을 때
정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int k = Integer.parseInt(br.readLine());
int[][] board = new int [N][N];
int[][] direction = {{1,0},{0,1},{-1,0},{0,-1}};
int cnt = N*N;
int x = 0;
int y = 0;
int d = 0;
int[] answer = new int[2];
while (cnt>0) {
if (cnt == k) {
answer[0] = x;
answer[1] = y;
}
board[x][y] = cnt--;
// 다음으로 나아갈 수 있으면 그대로 이동
if (0<= x+direction[d][0] && x+direction[d][0] < N && 0<= y+direction[d][1] && y+direction[d][1] < N && board[x+direction[d][0]][y+direction[d][1]] ==0) {
x += direction[d][0];
y += direction[d][1];
}else { // 나아갈 수 없으면 방향을 바꿔서 이동
d =(d+1)%4;
x += direction[d][0];
y += direction[d][1];
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(board[i][j]+" ");
}
sb.append("\n");
}
System.out.print(sb.toString());
System.out.println((answer[0]+1)+" "+(answer[1]+1));
}
}
기타
- 한번에 직선을 쭉 가는걸로 생각했는데 한칸 씩 생각해야 설계가 더 깔끔하다.
- 나는 못풀었는데 이게 쉬운문제라고 해서 슬펐다.
Author And Source
이 문제에 관하여(백준 1913번: 달팽이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qwerty1434/백준-1913번-달팽이저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)