https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net


풀이
실버3 난이도의 구현 문제로 생각보다 오래 걸렸다...
문제를 시작하기에 앞서 시작 위치와 방향 전환에 대해서 고민해봐야 한다.

우선 왼쪽 그림처럼 (0, 0) 을 시작점으로 두고 시작하게 되면 숫자가 1씩 작아지고, 오른쪽 그림처럼 (N/2, N/2) 에서 시작하게 되면 숫자가 1씩 증가한다. 또한 나아가는 방향의 순서도 반시계 방향, 시계 방향으로 달라진다.
공통적으로 방향 전환에 대해서 고민해봐야 할 필요가 있다.
int형 배열로 선언하게 되면 모든 값이 0으로 들어간다. 그렇다면 0이 아닌 값은 이미 방문했다는 소리다.
한 방향으로 진행하다가 배열의 범위를 넘어갔거나 0이 아닌 값을 만났을 경우 방향 전환을 해주면 된다.
마지막으로 4 방향을 다 돌았을 경우에 다시 0으로 초기화해주고 돌아가면 된다.
// 하, 우, 상, 좌를 다 반복했을 경우 처음부터 시작 if (idx == 4) { idx = 0; }
필자가 선택한 건 왼쪽 그림이다.
이유는 오른쪽 그림보다 간단하다고 생각했고 실제로도 그랬다.
필자는 주로 BufferedReader 와 System.out.println() 쓴다. 이 또한 이유는 없다. 그냥 익숙해서(?)..
위 문제를 풀면서 시간초과가 발생해서 System.out.println() 만 BufferedWriter 로 바꿔서 제출했더니 통과했다.
이번 계기로 속도 차이를 실감할 수 있었고, 앞으로 풀 알고리즘은 BufferedReader 와 BufferedWriter 를 이용해서 풀 예정이다.
<최종코드>
import java.io.*; public class Main { public static void main(String[] args) throws IOException { int[] dx = {1, 0, -1, 0}; int[] dy = {0, 1, 0, -1}; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); int M = Integer.parseInt(br.readLine()); int num = N * N; int[][] map = new int[N][N]; int x = 0; int y = 0; int idx = 0; while(true) { map[x][y] = num; int nx = x + dx[idx]; int ny = y + dy[idx]; // 범위에서 벗어나거나 값이 이미 들어있을 경우 방향 전환 if (nx < 0 || ny < 0 || nx >= N || ny >= N || map[nx][ny] != 0) { idx++; } // 하, 우, 상, 좌를 다 반복했을 경우 처음부터 시작 if (idx == 4) { idx = 0; } x += dx[idx]; y += dy[idx]; num--; if (num == 0) break; } // 출력 int ansX = 0, ansY = 0; for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { bw.write(map[i][j]+" "); if (map[i][j] == M) { ansX = i+1; ansY = j+1; } } bw.write("\n"); } bw.write(ansX + " " + ansY); bw.flush(); bw.close(); br.close(); } }

내가 생각한 시간 복잡도: O(N2)
'알고리즘 > 구현 & 그리디 & 브루트포스' 카테고리의 다른 글
[백준]JAVA - 15683번: 감시 (0) | 2022.11.22 |
---|---|
[백준]JAVA - 10773번: 제로 (0) | 2022.11.21 |
[백준]JAVA - 2503번: 숫자 야구 (0) | 2022.11.15 |
[백준]JAVA - 1034번: 램프 (0) | 2022.11.12 |
[백준]JAVA - 1202번: 보석 도둑 (0) | 2022.10.21 |