1. 문제 풀이 방법
처음에는 각 방향에 대해 이동하는 함수를 별도로 구현하여 시도하였지만 실패하였고, 결국 교제를 보고 해결하였다.
핵심은 각 방향에 대한 값을 배열로 관리하는 것인데 해당 문제에서 이동 방향은
위쪽, 오른쪽, 왼쪽 위 이렇게 3방향이다.
이 방향들을 각각 2차원 배열 좌표 기준으로 표현하면 이렇다.
static int [] dx = {0,1,-1};
static int [] dy = {1,0,-1};
dx가 열에 대한 증가량, dy가 행에 대한 증가량, 방향은 순서대로 위쪽, 오른쪽, 왼쪽
그러면 아래 방향을 가리키는 dx[0] ,dy[0]을 현재 좌표에 더하여 아래로 더 이동할 수 없을 때까지 증가시키고
그 이후에 오른쪽 방향인 dy[1], dy[1]를 현재 좌표에 대하여 오른쪽으로 더 이동할 수 없을 때까지 증가시킨다.
마지막으로 같은 논리로 왼쪽 위도 처리해주면 된다.
여기서 포인트는 크게 3가지다.
1. 해당 방향의 마지막 지점을 구분하는 포인트는 배열의 행,열 끝까지 가거나, 0이 아닌 수가 나올 경우로 처리하는 것(안쪽으로 한 바퀴 돌게 될 경우)
2. 왼쪽 위로 다 돌고 난 뒤 다시 아래로 이동하는 처리
2. 코드
void 삼각_달팽이() throws Exception{
int n = 4;
int d = 0;
int v = 1;
int x = 0;
int y = 0;
int [][] arr = new int[n][n];
int maxValue = n*(n+1)/2;
int [] result = new int[maxValue];
while (true){
arr[y][x] = v++;
int nx = x + dx[d];
int ny = y + dy[d];
// 방향을 트는 조건
if (ny == n|| nx == n || nx == -1 || ny == -1 || arr[ny][nx] != 0){
d = (d+1) % 3; // 왼쪽 위로 이동 후 다시 아래로 내려오기 위해
}
// 방향을 틀었을 경우 증가량을 다시 세팅해주어야 함.
nx = x + dx[d];
ny = y + dy[d];
x = nx;
y = ny;
if (v == maxValue+1) break;
}
반응형
'Algorithm' 카테고리의 다른 글
재귀 알고리즘 상향식/하향식 분석 방법(with 피보나치수열) (0) | 2024.01.27 |
---|---|
재귀 알고리즘 팩토리얼 예제 (0) | 2024.01.25 |
퀵 정렬 예시 & 버블 정렬과 속도 비교 (0) | 2024.01.24 |