Seren dev's blog
article thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

n x n 크기의 2차원 배열을 생성하여, 우하향 대각선 기준으로 아랫부분만 번호를 채운다.

int lastNum: 마지막 번호

int[][] arr: 번호를 저장할 2차원 배열

int sequence = 1 -> lastNum

int[] dr, int[] dc

int dir = 0, 1, 2

int r, c: 현재 위치의 행, 열 번호

 

로직

while(탈출조건 => sequence == lastNum)

1. 현 방향으로 이동

2-1. 인덱스 안이면서 빈 칸이면 arr[][] = ++sequence

2-2. 인덱스 밖이거나 빈 칸이 아니면 dir++

코드

class Solution {
    public int[] solution(int n) {
        int lastNum = (n+1)*n/2;
        
        int[][] arr = new int[n][n];
        int sequence = 1;
        int[] dr = {1, 0, -1};
        int[] dc = {0, 1, -1};
        int dir = 0;
        
        int r = 0;
        int c = 0;
        
        arr[r][c] = sequence;
        
        while (sequence < lastNum) {
            int nr = r + dr[dir];
            int nc = c + dc[dir];
            
            if (nr >= 0 && nr < n && nc >= 0 && nc < n && arr[nr][nc] == 0) {
                arr[nr][nc] = ++sequence;
                r = nr;
                c = nc;
            }
            else {
                dir = (dir+1) % 3;
            }
        }
        
        int[] answer = new int[lastNum];
        int idx = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                answer[idx++] = arr[i][j];
            }
        }
        
        return answer;
    }
}
728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!