주녘공부일지

[프로그래머스 C#] Lv.2 삼각 달팽이 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 삼각 달팽이

주녘 2023. 12. 8. 18:43
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

문제에 제시된 그대로 풀면 되는 문제 ( 문제의 그림보단 직각삼각형 형태로 생각하는 게 편함 )

 

Point 1 ) 가변배열을 선언해 아래 이동 -> 우측 이동 -> 대각 이동을 반복하며 값을 다 채우면 됨

Point 2 ) 값을 다 채운지 확인은 마지막 번호를 체크해서 판단

Point 3 ) 2차원 가변배열을 1차원 배열로 변환하기 위해 리스트를 사용함

 

주석 참조

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public int[] solution(int n)
        {
            var answerList = new List<int>();
            var intArrays = new int[n][];
            int posY = 0, posX = 0, num = 1, maxNum = 0;

            // 마지막 번호가 몇번인지 확인
            for (int i = 1; i <= n; i++)
                maxNum += i;

            // 삼각형 모양의 2차원 가변배열 선언
            for (int i = 0; i < intArrays.Length; i++)
                intArrays[i] = new int[i + 1];

            // 1은 넣고 시작
            intArrays[0][0] = num++;

            // 배열에 값 세팅
            while (num <= maxNum)
            {
                // 아래 이동
                while (num <= maxNum && posY + 1 < intArrays.Length && intArrays[posY + 1][posX] == 0)
                    intArrays[++posY][posX] = num++;

                // 우측 이동
                while (num <= maxNum && posX + 1 < intArrays[posY].Length && intArrays[posY][posX + 1] == 0)
                    intArrays[posY][++posX] = num++;

                // 대각 이동 (배열의 범위를 벗어나지 않을 것)
                while (num <= maxNum && intArrays[posY - 1][posX - 1] == 0)
                    intArrays[--posY][--posX] = num++;
            }

            // 2차원 가변배열 -> 리스트에 담음
            for (int i = 0; i < intArrays.Length; i++)
                for (int j = 0; j < intArrays[i].Length; j++)
                    answerList.Add(intArrays[i][j]);

            return answerList.ToArray();
        }
    }
728x90