떵호
seongho'Dev
떵호
전체 방문자
오늘
어제
  • 분류 전체보기 (116)
    • 회고 (2)
    • Algorithm (74)
      • 프로그래머스 (65)
      • 백준(BOJ) (2)
      • Note (7)
    • 기술독서 (25)
      • Clean Code (11)
      • 자바의 정석 (8)
      • 대규모 시스템 설계 기초 (6)
    • Computer Science (1)
      • Operating System (1)
    • Typescript (1)
    • JAVA (0)
    • Spring (6)
      • JPA (6)
    • AWS (2)
    • Git (2)
    • Etc (2)

블로그 메뉴

  • github

티스토리

태그

  • 알고리즘
  • 코딩테스트 준비
  • 구현
  • 프로그래머스
  • 완전탐색
  • 자바의 정석
  • Clean Code
  • JPA
  • 클린코드
  • 카카오 코테
hELLO · Designed By 정상우.
떵호

seongho'Dev

[java] 프로그래머스 - 삼각 달팽이 (Level 2)
Algorithm/프로그래머스

[java] 프로그래머스 - 삼각 달팽이 (Level 2)

2022. 2. 26. 15:42
728x90
 

코딩테스트 연습 - 삼각 달팽이

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]

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 == 7, (row, col)
⬇︎ : (0, 0) -> (1, 0) -> (2, 0) -> (3, 0) -> (4, 0) -> (5, 0) -> (6, 0)
➡︎  : (6, 1) -> (6, 2) -> (6, 3) -> (6, 4) -> (6, 5) -> (6, 6) -> 
⬉  : (5, 5) -> (4, 4) -> (3, 3) -> (2, 2) -> (1, 1) -> 
⬇︎ : (2, 1) -> (3, 1) -> (4, 1) -> (5, 1) ->
➡︎  : (5, 2) -> (5, 3) -> (5, 4) ->
⬉  : (4, 3) -> (3, 2) ->
⬇︎ : (4, 2)

위 예시를 보면 세로에서 가로로 전환할 때는 (row, col + 1), 가로에서 좌상향으로 전환할 땐 (row - 1, col - 1), 좌상향에서 세로로 전환할 때는 (row + 1, col)으로 좌표가 바뀐다는 것과 n은 1씩 줄어든다.

이 과정을 구현하여 2차원 배열에 저장하고, 저장한 값을 return 하면 된다.

💻 코드

class Solution {

    static int[][] snail;
    static int max_value = 0;
    static int number = 0, row = 0, col = 0;

    public int[] solution(int n) {
        initialize(n);

        while (true) {
            if (rowIncrease(n--) == max_value) {
                break;
            }
            if (colIncrease(n--) == max_value) {
                break;
            }
            if (rowAndColIncrease(n--) == max_value) {
                break;
            }
        }

        return getAnswerAndReturn();
    }

    private int[] getAnswerAndReturn() {
        int[] ret = new int[max_value];
        int i = 0;
        for (int[] s : snail) {
            for (int n : s) {
                ret[i++] = n;
            }
        }
        return ret;
    }

    void initialize(int n) {
        max_value = (n * (n + 1) / 2);
        snail = new int[n][];
        for (int i = 0; i < n; i++) {
            snail[i] = new int[i + 1];
        }
    }

    int rowIncrease(int n) {
        for (int i = 0; i < n; i++) {
            snail[row++][col] = ++number;
        }
        row -= 1;
        col += 1;
        return number;
    }

    int colIncrease(int n) {
        for (int i = 0; i < n; i++) {
            snail[row][col++] = ++number;
        }
        row -= 1;
        col -= 2;
        return number;
    }

    int rowAndColIncrease(int n) {
        for (int i = 0; i < n; i++) {
            snail[row--][col--] = ++number;
        }
        row += 2;
        col += 1;
        return number;
    }
}
728x90
저작자표시

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

[JAVA 풀이] 프로그래머스 - 주식 가격 (Level 2)  (1) 2022.03.22
[JAVA 풀이] 프로그래머스 - 영어 끝말잇기 (Level 2)  (0) 2022.03.21
[java] 프로그래머스 - 2개 이하로 다른 비트 (Level 2)  (1) 2022.02.20
[javascript] 프로그래머스 - 숫자 문자열과 영단어 (2021 카카오 채용 연계형 인턴십)  (0) 2022.02.15
[cpp] 프로그래머스 - 거리두기 확인하기 (2021 카카오 채용 연계형 인턴십)  (0) 2022.02.15
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [JAVA 풀이] 프로그래머스 - 주식 가격 (Level 2)
    • [JAVA 풀이] 프로그래머스 - 영어 끝말잇기 (Level 2)
    • [java] 프로그래머스 - 2개 이하로 다른 비트 (Level 2)
    • [javascript] 프로그래머스 - 숫자 문자열과 영단어 (2021 카카오 채용 연계형 인턴십)
    떵호
    떵호

    티스토리툴바