문제 풀기/C#

108. 삼각 달팽

kagan-draca 2025. 4. 24. 17:43

 

기본 틀 : 

 

using System;

public class Solution {
    public int[] solution(int n) {
        int[] answer = new int[] {};
        return answer;
    }
}

 

문제를 해결하기 위해서 1차원 배열을 사용해야 하는지 아니면 2차원 배열을 사용해야 하는지 

 

+

 

반복문은 어떤 형태로 동작 시켜야 하는지 많이 고민했다.

 

 

배열은 1차원 배열로 바로 결과를 만드는 건 불가능하다 생각해서 2차원 배열을 사용했다.

 

        int[,] triangle = new int[n, n];

 

반복문으로 값을 결정하는 방법으로는

 

	int num = 1;
        int x = -1, 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] = num++;
            }
        }

 

위와 같이 작성 했는데

 

i % 3 == 0이면 x를 증가시켜 2차원 배열 안에 정해진 n의 크기 만큼 숫자가 들어갈 수 있도록 구현했다.

 

ex ) n = 4이면

 

 

[1, 0, 0, 0]
[2, 0, 0, 0]
[3, 0, 0, 0]
[4, 0, 0, 0]

 

배열들의 첫 번째 위치에 해당 값들이 들어갈 수 있도록 만든 것이다.

 

i % 3 == 1인 경우는 y를 증가시켜

 

마지막 행의 열에 다음 숫자들이 올 수 있도록 만들어줬다.

 

ex ) 

 

[1, 0, 0, 0]
[2, 0, 0, 0]
[3, 0, 0, 0]
[4, 5, 6, 7]

 

다음으로

 

i % 3 == 2인 경우 x와 y를 1씩 감소시켜 줘서

 

 

[1, 0, 0, 0]
[2, 9, 0, 0]
[3, 0, 8, 0]
[4, 5, 6, 7]

 

삼각형 형태가 될 수 있도록 만들어줬다.

 

 

위의 3단계 과정을 반복 진행하면

 

[1, 0, 0, 0]
[2, 9, 0, 0]
[3,10, 8, 0]
[4, 5, 6, 7]

 

위와 같이 2차원 배열에 삼각형 모양으로 값이 저장된다.

 

이를 List를 활용해서

        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]);
            }
        }
        
                
        return result.ToArray();

 

배열의 요소를 리스트에 저장 후

 

배열로 변환 및 반환 과정을 거치면 문제를 해결할 수 있었다

 

전체 코드 :

 

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int n) 
    {
        int[,] triangle = new int[n, n];
        int num = 1;
        int x = -1, 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] = num++;
            }
        }
        
        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]);
            }
        }
        
        return result.ToArray();
    }
}

 

이 문제를 통해 반복문과 배열을 이런 방식으로 조회 및 값을 삽입할 수 있다는 사실에 놀라움과 실력적으로 부족함을 느낀다...