[프로그래머스][Level2][Java] 삼각 달팽이

2022. 10. 31. 18:23·프로그래머스/Level 2

문제

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

 

프로그래머스

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

programmers.co.kr

 

풀이 코드

public int[] solution(int n) {              //삼각 달팽이
    int[] answer = new int[(n*(n+1))/2];    //삼각형의 갯수만큼 배열 생성
    int[][] matrix = new int[n][n];         //위치에 따라 숫자들을 차례대로 저장할 이차원 배열 생성

    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) {               //순서대로 아래로 내려갈 때 변하는 좌표값
                x++;
            } else if (i % 3 == 1) {        //순서대로 오른쪽으로 갈 때 변하는 좌표값
                y++;
            } else if (i % 3 == 2) {        //순서대로 대각선 위쪽으로 갈 때 변하는 좌표값
                x--;
                y--;
            }
            matrix[x][y] = num++;           //정해진 좌표에 순서대로 1부터 (n*(n+1))/2까지 대입한다.
        }
    }

    int k = 0;                              //이차원배열의 값을 순서대로 answer에 옮겨 넣는 작업
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(matrix[i][j] == 0){
                continue;
            }
            answer[k++] = matrix[i][j];
        }
    }

    return answer;
}

 

코드 해설

int[] answer = new int[(n*(n+1))/2];    //삼각형의 갯수만큼 배열 생성
int[][] matrix = new int[n][n];         //위치에 따라 숫자들을 차례대로 저장할 이차원 배열 생성
  1. 여기서 n의 숫자에 따라 삼각형을 이루는 사각형의 숫자가 N + (N-1) + (N-2) + ... + 1 이런식으로 되기 때문에 1부터 n을 더하는 공식을 써서 답을 넣을 배열 answer에 총 사각형의 갯수만큼 배열을 생성해주고
  2. matri2x에는 nxn 배열을 담을 공간을 할당해서 생성해준다.

 

우선, 2번째 코드 부분을 해석하기 전에 간단히 알아둬야 할 것이 있다.

문제에서는 이런 식으로 나왔지만 내가 풀이를 할 때에는

 

이런 식으로 한쪽으로 다 밀어서 생각을 할 것이다.

위의 검은 그림에서 보면 숫자가

1. 처음에는 아래로 증가

2. 아래쪽 끝에서는 오른쪽으로 증가

3. 오른쪽 끝에서는 대각선 왼쪽 위로 증가가 된다.

4. 1부터 다시 반복

 

그리고 위의 그림을 좌표 평면위에 나타내면

이런 식으로 나타낼 수 있고

숫자 1이 들어갈 자리의 좌표를 (0,0)으로 잡고

1. 아래로 내려갈때, x좌표를 +1

2. 오른쪽으로 갈때, y좌표를 +1

3. 대각선으로 갈때, x,y좌표를 각각 -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) {               //순서대로 아래로 내려갈 때 변하는 좌표값
            x++;
        } else if (i % 3 == 1) {        //순서대로 오른쪽으로 갈 때 변하는 좌표값
            y++;
        } else if (i % 3 == 2) {        //순서대로 대각선 위쪽으로 갈 때 변하는 좌표값
            x--;
            y--;
        }
        matrix[x][y] = num++;           //정해진 좌표에 순서대로 1부터 (n*(n+1))/2까지 대입한다.
    }
}

이렇게 되고 

  • x = -1, y = 0으로 설정한 이유는 반복문을 사용할 때, 제일 처음 1이 들어가는 곳을 (0,0)으로 잡기 위해서 그런 것이다.
  • 그리고 반복문에서 i % 3을 기준으로 삼은건 위에서 설명했다시피 이 문제에서 숫자가 증가할때 위치 메커니즘이 아래로 증가, 오른쪽으로 증가, 대각선으로 증가
    이렇게 3가지 메커니즘 밖에 없기 때문에 i % 3을 기준으로 각각 if문으로 결과를 나눴다.
  • matrix에 좌표에 따른 숫자들을 집어 넣는다.

 

int k = 0;                              //이차원배열의 값을 순서대로 answer에 옮겨 넣는 작업
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(matrix[i][j] == 0){
                continue;
            }
            answer[k++] = matrix[i][j];
        }
    }

    return answer;
}

여기는 주석에 나온대로 그냥 matrix 배열을 순서대로 answer에 옮기는 작업이다.

 

저작자표시 비영리 (새창열림)

'프로그래머스 > Level 2' 카테고리의 다른 글

[프로그래머스][Level2][Java] 다리를 지나는 트럭  (0) 2024.01.13
[프로그래머스][Level2][Java] 줄 서는 방법  (0) 2022.08.26
[프로그래머스][Level2][Java] 하노이의 탑  (0) 2022.08.26
[프로그래머스][Level2][Java] 멀리 뛰기  (0) 2022.06.14
[프로그래머스][Level2][Java] 구명보트  (0) 2022.06.11
'프로그래머스/Level 2' 카테고리의 다른 글
  • [프로그래머스][Level2][Java] 다리를 지나는 트럭
  • [프로그래머스][Level2][Java] 줄 서는 방법
  • [프로그래머스][Level2][Java] 하노이의 탑
  • [프로그래머스][Level2][Java] 멀리 뛰기
BvrPark
BvrPark
코드 퍼즐과 개발 일상
  • BvrPark
    비버의 개발 일지
    BvrPark
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • JAVA (7)
        • 메서드 외울 것 (2)
      • 프로그래머스 (56)
        • 총 풀이 코드(깃허브) (1)
        • Level 1 (22)
        • Level 2 (33)
      • 백준 알고리즘(단계 별) (16)
        • 총 풀이 코드(깃허브) (1)
        • 1. 입출력과 사칙연산 (2)
        • 2. if 문 (2)
        • 3. for문 (1)
        • 4. while문 (2)
        • 5. 1차원 배열 (3)
        • 6. 함수 (1)
        • 7. 문자열 (1)
        • 8. 기본수학 1 (3)
      • 백준 알고리즘(solved.ac) (9)
        • 총 풀이 코드(깃허브) (1)
        • class2 (8)
      • LeetCode 문제 풀이 (4)
        • 총 풀이 코드(깃허브) (1)
        • Easy (3)
      • 코드업 알고리즘 (7)
      • git과 github사용법 (4)
      • html, css, javaScript (2)
      • 프로젝트 (11)
        • 순수 Java 프로젝트 (2)
        • 쇼핑몰 프로젝트 (2)
        • 게시판 프로젝트 (5)
        • 근태관리 프로젝트 (2)
      • 커피타임 (2)
        • 2023년 (2)
        • 2024년 (0)
  • 블로그 메뉴

    • 링크

      • 포트폴리오
      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • Designed By정상우
    BvrPark
    [프로그래머스][Level2][Java] 삼각 달팽이
    상단으로

    티스토리툴바