20240207_삼각 달팽이(프로그래머스)

2024. 2. 7. 20:56IT/TIL

오늘의 TIL은 프로그래머스의 문제인 멀쩡한 사각형에 관한 내용이다.

 

문제 링크

 

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

 

프로그래머스

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

programmers.co.kr

 

문제에 대해서 설명하면,

 

정수 n이 매개변수로 주어질 때, 밑변의 길이와 높이가 n인 삼각형에서

 

맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후,

 

첫 행부터 마지막 행까지 모두 순서대로 합친 배열을 return 하는 문제이다.

 

제한 사항

 

1 <= n <= 1,000

예시 설명

 

 

위의 그림과 같이 시작점(1)은 가장 위의 꼭지점이고,

 

그곳에서 좌측 아래로 순서대로 달팽이 채우기를 n만큼 진행한다.(아래)

 

그 이후에 n - 1 만큼 우측으로 달팽이 채우기를 진행하고,(오른쪽)

 

그 이후에 n - 2 만큼 좌측 위로 달팽이 채우기를 진행하고,(대각선 위)

 

이를 계속 반복하여 1 만큼 이동한 후에 종료하게 된다.

 

이후에 이를 위에서부터 배열로 만들어서 return 하는 것이다.

 

n = 4인 경우의 result = {1, 2, 9, 3, 10, 8, 4, 5, 6, 7} 이 된다.

 

정답 코드

더보기
using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int n) {
        int[] answer = new int[] {};
        
        int[,] triangle = new int[n, n];
        int value = 1;
        int x = -1;
        int y = 0;

        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
                {
                    x--;
                    y--;
                }
                triangle[x, y] = value++;
            }
        }

        List<int> result = new List<int>();
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j <= i; j++)
            {
                result.Add(triangle[i, j]);
            }
        }
        answer = result.ToArray();
        
        return answer;
    }
}

 

이 코드는 크게 두 부분으로 나눌 수 있는데,

 

하나는 삼각형을 그리는 부분, 나머지 하나는 그 삼각형들을 배열로 전환하는 부분이다.

 

삼각형을 그리는 부분을 살펴보면

 

int[,] triangle = new int[n, n];
int value = 1;
int x = -1;
int y = 0;

 

우선 삼각형에 필요한 값들을 정의해준다.

 

삼각형을 컴퓨터에서 표현할 수 있게 하기 위해 2차원 배열을 이용하여

 

좌표평면에 점을 찍는 느낌으로 삼각형을 그려서 관리하도록 2차원 배열을 이용한다.

 

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
        {
            x--;
            y--;
        }
        triangle[x, y] = value++;
    }
}

 

이후에 삼각형을 그리는 과정을 살펴보면

 

i를 통해서 전체 삼각형의 그리는데 방향이 바뀌는 과정을 판별하고,

 

j를 통해서 각 변마다 n, n-1, n-2, n-3, ... 의 값들을 입력할 수 있도록 한다.

 

그 후에 배열에 해당하는 값들을 1부터 순차적으로 입력한다.

 

(이 코드의 결과가 예시로 주어지는 그림과 같다)

 

 

이후에 이 삼각형의 데이터들을 배열로 전환하는 과정은 아래와 같다.

 

List<int> result = new List<int>();
for (int i = 0; i < n; i++)
{
    for (int j = 0; j <= i; j++)
    {
        result.Add(triangle[i, j]);
    }
}
answer = result.ToArray();

 

여기서는 n이 주어졌을 때, 필요한 원소들(배열의 길이)을 계산하여 배열로 선언하는 것보다

 

리스트를 작성하여 Add를 사용하는 것이 더 효율적이므로

 

리스트를 선언한 후에, 모든 triangle의 값들을 리스트에 추가하고,

 

이를 배열로 변환해서 return하도록 문제를 해결했다.

 

 

 

오늘의 문제였던 삼각 달팽이는 그림으로 그리면서 풀면 어렵지 않지만,

 

이를 컴퓨터 상에서 어떤 방식으로 값을 입력해야되는지 고민을 많이 해야됬던 문제로

 

어제에 이어서 수학적으로 문제를 푸는 과정을 컴퓨터에게 연결해주는 문제라고 생각해서 정리하게 되었다.

'IT > TIL' 카테고리의 다른 글

20240208_기술면접 회고  (1) 2024.02.09
20240207_유니티 상속 관련  (0) 2024.02.07
20240206_멀쩡한 사각형(프로그래머스)  (0) 2024.02.06
20240205_SOLID원칙  (0) 2024.02.05
20240204_마법의 엘리베이터(프로그래머스)  (0) 2024.02.05