(x,y-1)
(x-1,y) (x,y) (x+1,y)
(x,y+1)
dx는 x의 변화량
dy는 y의 변화량
변화량이라는 것은 특정 방향으로 이동할 때 해당 좌표 값이 어떻게 변화하는지 의미
상 | 하 | 좌 | 우 | |
---|---|---|---|---|
dx | 0 | 0 | -1 | 1 |
dy | -1 | -1 | 0 | 0 |
위 방향을 배열로 나타낸다.
private static final int[] dx = {0,0,-1,1};
private static final int[] dy = {-1,1,0,0};
위 배열의 인덱스는 방향을 나타낸다.
x += dx[0];
y += dy[0];
예를 들어 이 코드는 x와 y를 위쪽으로 한칸 이동시키는 코드다.
삼각 달팽이 문제에서는 3개의 방향만 반복해서 사용한다.
아래 | 오른쪽 | 왼쪽 위 | |
---|---|---|---|
dx | 0 | 1 | -1 |
dy | 1 | 0 | -1 |
왼쪽 위값 적용 방식
현재 위치가 (3, 3)이라고 해보면:
아래 → (3, 4) → +0, +1
오른쪽 → (4, 3) → +1, +0
왼쪽 위 → (2, 2) → -1, -1
3개의 방향을 코드로 표현
private static final int[] dx = {0,1,-1};
private static final int[] dy = {1,0,-1};
삼각달팽이 값이 밑변과 높이가 같은 배열내에 있다고 가정하고 배열을 만든다.
그리고 x,y와 방향의 배열값을 나타내는 변수를 0으로 초기화 해준다
int[][] triangle = new int[n][n];
int x = 0; //x값
int y = 0; //y값
int d = 0; //방향값
dx,dy를 사용하면 모든 방향에 동일한 로직을 적용시킬 수 있다.
진행 방향을 d 변수에 저장했으므로 다음위치는 아래 코드처럼 계산할수있다.
int nx = x + dx[d];
int ny = y + dy[d];
여기서 nx, ny는 현재 위치가 아니라, 다음 위치(next x, next y) 를 의미한다.
더 이상 진행할 수 없는 조건 걸기
if (nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0)
nx == n || ny == n || nx == -1 || ny == -1
triangle[ny][nx] != 0
방향을 나타내는 d의 배열값 순서는 아래 순서이다.
아래 -> 오른쪽 -> 왼쪽위 d= [0] [1] [2]
이 방향이 반복되는데, 다음 방향으로 바꾸기위해
d = (d +1) % 3;
이렇게 코드를 작성한다.
다음 방향으로 변경하는 코드
if (nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0) { d = (d + 1) % 3; // 방향 바꿈 (0 → 1 → 2 → 0) nx = x + dx[d]; // 새로운 방향으로 다음 위치 다시 계산 ny = y + dy[d]; if (nx == n || ny == n || nx == -1 || ny == -1 || triangle[ny][nx] != 0) { break; // 다시 방향 바꿨는데도 갈 수 없으면 반복 종료 }
int[] result = new int[v-1];
만약 삼각형에 숫자를 1, 2, 3, ..., 10까지 채웠다면?
- v = 1부터 증가
- 마지막으로 채운 숫자는 10
- 그 다음 v는 11이 되어 있음
- 즉, v - 1 = 10 → 총 10개의 숫자가 채워졌다는 뜻
한 배열 안에 넣기
int index = 0; for (int i=0; i<n; i++) { for (int j=0; j<=; j++){ result[index++] = triangle[i][j]; } }