일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 깃헙
- AWS
- 그리디
- MySQL
- 백준 1987
- 머신러닝과 딥러닝
- 백준 1253번
- 백준 1331번
- 백준
- 알고리즘
- SQL
- Python
- SWEA 15612번
- 자바
- ubuntu
- 그래프
- 다이나믹프로그래밍
- 백준 17451번
- 백준 2512번
- HUFS 모각코 캠프
- 백준 18310번
- react
- 백준 15787번
- 모각코
- 다이나믹 프로그래밍
- 백준 16918번
- java_programming
- javascript
- 백준 3085번
- 명품자바
Archives
- Today
- Total
차곡차곡
[SWEA/Python, Java] SW Expert Academy 1954번 - 달팽이 숫자 본문
SW Expert Academy #1954 달팽이 숫자
Python ver.
def in_range(x, y):
return 0 <= x < n and 0 <= y < n
def moving():
dx, dy = [-1, 0, 1, 0], [0, 1, 0, -1]
dir_num = 1
x, y = 0, -1
for i in range(1, n*n+1):
nx, ny = x + dx[dir_num], y + dy[dir_num]
if not in_range(nx, ny) or grid[nx][ny] != 0:
dir_num = (dir_num + 1) % 4
x, y = x + dx[dir_num], y + dy[dir_num]
grid[x][y] = i
T = int(input())
for t in range(1, T+1):
n = int(input())
grid = [[0] * n for _ in range(n)]
moving()
print(f"#{t}")
for i in range(n):
print(*grid[i])
Java ver.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
static int n;
static int[][] grid;
public static boolean inRange(int x, int y) {
return 0 <= x && x < n && 0 <= y && y < n;
}
public static void moving() {
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int dirNum = 1;
int x = 0;
int y = -1;
int nx, ny;
for (int i = 1; i < n*n+1; i++) {
nx = x + dx[dirNum];
ny = y + dy[dirNum];
if (!inRange(nx, ny) || grid[nx][ny] != 0) {
dirNum = (dirNum + 1) % 4;
}
x = x + dx[dirNum];
y = y + dy[dirNum];
grid[x][y] = i;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); // 테스트케이스 수
for (int i = 1; i <= T; i++) {
n = Integer.parseInt(br.readLine()); // 달팽이의 크기
grid = new int[n][n];
moving();
System.out.println("#" + i);
for (int j = 0; j < n; j++) {
for (int j2 = 0; j2 < n; j2++) {
System.out.printf("%d ", grid[j][j2]);
}
System.out.println();
}
}
}
}
이동 방향에 번호를 붙이고, 그 번호를 dx, dy 인덱스로 사용한다. dx, dy 리스트 원소는 각 이동 방향에 맞춰 채워준다.
시계 방향으로 회전하는 문제가 나오면 0, 1, 2, 3을 시계 방향으로 적어주는 것이 중요!
- 90˚ 회전 ⇒ dir_num = (dir_num + 1) % 4
- -90˚ 회전 ⇒ dir_num = (dir_num - 1 + 4) % 4
(4 : 음수를 양수로 바꿔줌)
'CS > Algorithm' 카테고리의 다른 글
[BOJ/Java] 백준 11659번 - 구간 합 구하기4 (0) | 2023.08.02 |
---|---|
[BOJ/Python, Java] 백준 2503번 - 숫자 야구 (0) | 2023.08.02 |
[BOJ/Java] 백준 1244번 - 스위치 켜고 끄기 (0) | 2023.08.01 |
[BOJ/Python, Java] 백준 11729번 - 하노이 탑 이동 순서 (0) | 2023.08.01 |
[SWEA/Python, Java] SW Expert Academy 2805번 - 농작물 수확하기 (0) | 2023.08.01 |
Comments