본문 바로가기
Algorithm/Programmers Java

[JAVA] 프로그래머스 LEVEL2 삼각 달팽이

by 제우제우 2024. 9. 28.

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

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > 월간 코드 챌린지 시즌1 > 삼각 달팽이

 

난이도: LEVEL2

알고리즘 유형: 구현 

 

(대각선 왼쪽 아래 → 오른쪽   대각선 오른쪽 위) 무한 반복 

더 이상 이동 불가능할 때까지  

 

정답 코드

import java.util.*;
class Solution {
    // 대각선 왼쪽 아래 / 오른쪽 / 대각선 위로  
    static int [] arx = {1,0,-1}; 
    static int [] ary = {0,1,-1};
    public int[] solution(int n) {
        int [][] memo = new int [n+1][n+1];
        memo[1][1] = 1;
        int x = 1; int y = 1;
        int cnt = 2;
        while(true){
            int d = -1;
            for(int i = 0; i < 3; i++){
                int nx = arx[i] + x;
                int ny = ary[i] + y;
                if(1 <= nx && 1 <= ny && nx <= n && ny <= n){
                    if(memo[nx][ny] == 0){
                        d = i; // 방향 정하기 
                        break;
                    }
                }
            }
            if(d == -1) break;
            while(true){
                boolean flag = true;
                int nx = arx[d] + x;
                int ny = ary[d] + y;
                if(1 <= nx && 1 <= ny && nx <= n && ny <= n){
                    if(memo[nx][ny] == 0){
                        flag = false;
                        memo[nx][ny] = cnt++;
                        x = nx;
                        y = ny;
                    }
                }
                if(flag) break;
            }
        }
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= i; j++){
                list.add(memo[i][j]);
            }
        }
        int [] answer = new int [list.size()];
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }
        return answer;
    }
}