hoon's bLog

Java 프로그래머스 삼각 달팽이 자바 본문

코딩테스트/프로그래머스

Java 프로그래머스 삼각 달팽이 자바

개발한기발자 2023. 4. 12. 11:10
반응형

문제출처 : https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

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

programmers.co.kr


[문제 설명]

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해 주세요.

[제한사항]

n은 1 이상 1,000 이하입니다.

[입출력 예]

n result
4 [1, 2, 9, 3, 10, 8, 4, 5, 6, 7]
5 [1, 2, 12, 3, 13, 11, 4, 14, 15, 10, 5, 6, 7, 8, 9]
6 [1, 2, 15, 3, 16, 14, 4, 17, 21, 13, 5, 18, 19, 20, 12, 6, 7, 8, 9, 10, 11]

[문제 풀기 전 생각/정리]

  • n = 4 일 때, 삼각형의 각 칸을 좌표로 표현하면 아래와 같다
[0, 0] [0, 1] [0, 2] [0, 3]
[1, 0] [1, 1] [1, 2] [1, 3]
[2, 0] [2, 1] [2, 2] [2, 3]
[3, 0] [3, 1] [3, 2] [3, 3]
  • 반시계 방향으로 삼각형을 채우는 규칙을 살펴보면 대각선 왼쪽 아래, 가로, 대각선 왼쪽 위 방향으로 반복하며 총 n회 실시
  • 삼각형을 채우는 규칙과 각 칸의 좌표들을 함께 살펴보면 다음과 같다
    • 대각선 아래로 이동할 때는 x좌표가 증가
    • 가로로 이동할 때는 y좌표가 증가
    • 대각선 위로 이동할 때는 x, y좌표가 감소
  • 결국 실제로 x좌표는 세로 방향, y좌표는 가로 방향으로 숫자가 조절된다고 보면 되겠다!!!

[나의 풀이]

public class Solution {
    public int[] solution(int n) {
        // 반환할 배열 크기 설정
        int[] answer = new int[(n*(n+1))/2];
        
        // 실제 보여질 삼각형모습을 좌표화 시킬 2차원 배열 선언
        int[][] tmpArr = new int[n][n];
        
        // 배열에 들어갈 인덱스를 고려하여 x좌표는 -1로 설정
        int x = -1, y = 0;
        
        //배열에 들어갈 숫자
        int num = 1;        

        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (i%3 == 0) {
                //대각선 아랫 방향(2차원 배열로는 세로 아랫 방향)
                    x++;
                }else if (i%3 == 1) {
                //가로 방향(2차원 배열로는 가로 오른쪽 방향)
                    y++;
                }else if (i%3 == 2) {
                //대각선 윗 방향(2차원 배열로는 세로 윗 방향)
                    x--;
                    y--;
                }
                tmpArr[x][y] = num++;
            }
        }

        int k = 0;
        
        // return할 배열에 값 저장
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(tmpArr[i][j] == 0)
                    break;
                answer[k++] = tmpArr[i][j];
            }
        }
        
        //2차원 배열 확인용 함수
        print2d(tmpArr);
        
        return answer;
    }

    public static void print2d(int[][] result) {
        int m = result.length;
        int n = result[0].length;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(result[i][j] + "\t");
            }
            System.out.println();
        }
        System.out.println("----------------------");
    }
}

[정리]

개인 피셜 난이도 : ★

2개라고는 했지만 2.5개 정도 되는 것 같다!

레벨 2부터는 조금씩 생각해야 하는 부분들이 많아지면서 어렵다는 느낌이 든다.

풀면서 종이에 케이스를 직접 그리지 않는 이상, 단순히 눈코딩, 손코딩도 쉽지 않음을 느꼈다.

다른 사람들의 풀이는 모두 비슷하게 2차원 배열을 이용한 풀이로 생략했다.

일하면서 하다 보니 풀이 속도가 잘 나지 않는데,

다음 문제부터는 문제풀이 속도에도 신경 쓰면서 풀어 나가야겠다.

 

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

끝.

728x90
반응형