삼각 달팽이(못품)

Psj·3일 전
0

코딩테스트

목록 보기
47/47


문제 풀이 흐름

  1. n X n 2차원 배열 선언
  2. 숫자를 채울 현재 위치를 (0,0)으로 설정
  3. 방향에 따라 이동할 수 없을 때까지 반복하면서 숫자 채우기
  • A. 아래로 이동하면서 숫자 채우기
  • B. 오른쪽으로 이동하면서 숫자 채우기
  • C. 왼쪽 위로 이동하면서 숫자 채우기
  1. 채워진 숫자를 차례대로 1차원 배열에 옮겨서 반환

배열 dx, dy로 방향을 정하는법

        (x,y-1)
(x-1,y)  (x,y)  (x+1,y)
        (x,y+1)

dx는 x의 변화량
dy는 y의 변화량

변화량이라는 것은 특정 방향으로 이동할 때 해당 좌표 값이 어떻게 변화하는지 의미

dx00-11
dy-1-100

위 방향을 배열로 나타낸다.

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개의 방향만 반복해서 사용한다.

아래오른쪽왼쪽 위
dx01-1
dy10-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];
    }
}
profile
Software Developer

0개의 댓글

관련 채용 정보