문제 풀기/C#

87. n^2 배열 자르기

kagan-draca 2025. 3. 7. 18:04

 

기본 틀 :

using System;

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

문제를 보고 처음에는 

using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int n, long left, long right) 
    {
        int[,] multiArray = new int[n,n];
        
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j <= i; j++)
            {
                multiArray[j,i] = i + 1;
                multiArray[i,j] = i + 1;
            }
        }
        
        List<int> list = new List<int>();
        int[] flatArray = multiArray.Cast<int>().ToArray();
        
        for(long i = left; i <= right; i++)
            list.Add(flatArray[i]);
        
        return list.ToArray();
    }
}

위와 같이 n의 크기에 따른 2차원 배열을 만들고

 

2차원 배열을 Cast<int>().ToArray()로

 

1차원 배열 형태로 만들어줬다.

 

그 후 Skip()과 Take()로 원한는 만큼의 배열을 자를 계획이었지만,

 

left와 right가 long 타입이라 사용하지 못하고 

 

고민 끝에 List를 만들어 원하는 만큼 추출해냈다.

 

그 결과...

 

 

런 타임 에러(int 형 자료의 한계 => long을 써야 한다는 뜻) + 시간초과에 빠졌다...

 

결국 다른 풀이법이 떠오르지 않아서

 

과거에 JavaScript로 어떻게 풀었는지 찾아봤다...

(오늘도 과거의 나 한테 졌다...)

 

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int n, long left, long right) 
    {
        List<int> list = new List<int>();
        for(long i = left; i <= right; i++)
        {
            int div = (int)(i / n);
            int mod = (int)(i % n);
            
            int temp = mod >= div ? mod + 1 : div + 1;
            list.Add(temp);
        }
        
        return list.ToArray();
    }
}

JavaScript 코드를 C#으로 바꾸면 위와 같은 코드가 되며

 

List에 left ~ right까지의 순차적으로 나눈 몫과 나머지를 구하여 그 중 큰 값에 +1 한 값을 

 

List에 담는 형태로 문제를 해결했었다...

 

'문제 풀기 > C#' 카테고리의 다른 글

89. 할인 행사  (0) 2025.03.11
88. 행렬의 곱셈  (0) 2025.03.11
86. H-index  (0) 2025.03.06
85. 연속 부분 수열 합의 개수  (0) 2025.03.04
84. 괄호 회전하기  (0) 2025.03.04