코드의 여백

[프로그래머스] Lv. 2 삼각 달팽이(Java)

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

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

정답 코드 1 : 구조 개선 전

class Solution {
    public int[] solution(int n) {
        int[][] triangle = new int[n][n];
        int x = 0;
        int y = 0;
        int v = 1;
        
        while (true) {
            // 아래로 이동
            while (true) {
                triangle[y][x] = v++;
                if (y + 1 == n || triangle[y + 1][x] != 0) break;
                y += 1;
            }
            if (x + 1 == n || triangle[y][x + 1] != 0) break;
            x += 1;
            
            // 오른쪽으로 이동
            while (true) {
                triangle[y][x] = v++;
                if (x + 1 == n || triangle[y][x + 1] != 0) break;
                x += 1;
            }
            if (triangle[y - 1][x - 1] != 0) break;
            x -= 1;
            y -= 1;
            
            // 왼쪽 위로 이동
            while (true) {
                triangle[y][x] = v++;
                if (triangle[y - 1][x - 1] != 0) break;
                x -= 1;
                y -= 1;
            }
            if (y + 1 == n || triangle[y + 1][x] != 0) break;
            y += 1;
        }
    
        int[] result = new int[v - 1];
        int index = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                result[index++] = triangle[i][j];
            }
        }       
    
        return result;
    }
}

 

실행 결과 1 : 구조 개선 전

 

설명

이 문제에서는 삼각형을 표현해야 하며, 이를 2차원 배열로 나타내어 해결했다.

문제의 조건인 반시계 방향으로 '달팽이 채우기'를 진행하기 위해, 방향을 아래 → 오른쪽 → 왼쪽 위 순으로 설정했다.

 

그러나 현재 코드에서는 모든 방향에 대한 수정을 직접 해야 하는 번거로움이 있다.

이를 최소화하기 위해 dx와 dy를 활용하는 방법을 알아보자.

 

dx와 dy의 의미

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

즉, 특정 방향으로 이동할 때 좌표 값이 어떻게 변화하는지를 나타낸다.

 

삼각 달팽이 문제에서의 dx, dy

방향 아래 오른쪽 왼쪽 위
dx 0 1 -1
dy 1 0 -1

이처럼 dx와 dy를 활용하면 방향별 좌표 이동을 간결하게 처리할 수 있다.

 

방향 변수 d의 전환 과정

 

정답 코드 2 : 구조 개선 후

class Solution {
    
    private static final int[] dx = {0, 1, -1};
    private static final int[] dy = {1, 0, -1};
    
    public int[] solution(int n) {
        int[][] triangle = new int[n][n];
        int v = 1;
        int x = 0;
        int y = 0;
        int d = 0;
        
        while (true) {
            triangle[y][x] = v++;
            int nx = x + dx[d];
            int ny = y + dy[d];
            if (nx == n || ny == n || triangle[ny][nx] != 0) {
                d = (d + 1) % 3;
                nx = x + dx[d];
                ny = y + dy[d];
                if (nx == n || ny == n || triangle[ny][nx] != 0) break;
            }
            x = nx;
            y = ny;
        }
        
        int[] result = new int[v - 1];
        int index = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                result[index++] = triangle[i][j];
            }
        }       
    
        return result;
    }
    
}

 

실행 결과 2 : 구조 개선 후

 

마무리

이번 문제를 풀면서 성능과 코드량 간의 트레이드오프를 경험했다.

구조 개선 전 코드는 성능이 더 뛰어났지만, 코드량이 많았다.

개선 후 코드는 코드량이 줄었지만, 가독성이나 유지보수성은 크게 달라지지 않았다.

 

이 과정을 통해, 상황에 따라 성능과 코드 간결함 사이에서 균형을 잡는 것이 중요하다는 점을 배울 수 있었다.

 

참고 자료 :

취업과 이직을 위한 프로그래머스 코딩 테스트 문제 풀이 전략 : 자바 편 | 김현이

 

프로그래머스 코딩 테스트 문제 풀이 전략: 자바 편 | 김현이 - 교보문고

프로그래머스 코딩 테스트 문제 풀이 전략: 자바 편 | 핵심 개념, 프로그래머스에서 선별한 79개 문제 풀이, PCCP 대비까지! 합격에 한 걸음 더 가까워지는 실전형 코딩 테스트 문제 풀이 가이드개

product.kyobobook.co.kr

블로그의 정보

코드의 여백

rowing0328

활동하기