Coding Test/Programmers

[Lv.2] n^2 배열 자르기 [프로그래머스_코딩테스트] [구현, 인덱스 규칙 관찰] [30분]

whawoo 2025. 6. 7. 16:24
반응형

🔍 문제 요약

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

정수 n과 left, right가 주어질때 n*n 크기의 2차원 배열을 만든다 하고 i행 i열까지 숫자 i로 채운 2차원 배열을 1차원 배열로 풀어서, left, right 인덱스값에 해당하는 숫자들을 반환하는 문제

🧠 나의 접근 방식과 시행착오

딱 30분 정도 걸린 문제. 생각외도 규칙을 찾으면 단순하게 풀 수 있는 문제긴 하다. 문제의 방식은 빠르게 생각했는데 자료형이 long으로 인자가 주어지는 바람에 row, col 값을 구할때 형변환을 바로 해서 구하는 게 맞나?란 생각에 잡혀서 시간을 좀 더 끌었던 문제. 풀이는 아래처럼 하였다. 모든 테스트 케이스 맞춘 문제. 시간 복잡도나 측면에서 그렇게 문제는 되지 않을 듯 하다. 피드백을 좀 더 해서 줄인다면 index는 굳이 필요 없겠다는 것을 깨달음. i - left로 해도 되었을 것 같다.

using System;

public class Solution
{
    /// <summary>
    /// n^2 배열 자르기
    /// https://school.programmers.co.kr/learn/courses/30/lessons/87390
    /// </summary>
    public int[] solution(int n, long left, long right)
    {
        int[] answer = new int[right - left + 1];
        
        // n 열 단위로 잘라내기
        // 1~n : 1, ~ n
        // n+1 ~ n+n : 2, 2 ~ n
        // n+n+1 ~ n+n+n : 3, 3, 3 ~ n

        int index = 0;
        
        for (long i = left; i <= right; i++)
        {
            var row = i / n + 1;
            var col = i % n + 1;

            if (col <= row)
            {
                answer[index] = (int)row;
            }
            else
            {
                answer[index] = (int)col;
            }

            index++;
        }
        
        return answer;
    }
}

/// <summary>
/// C# 7.3
/// </summary>
internal class Program
{
    public static void Main(string[] args)
    {
        var sl = new Solution();
        int n1 = 3;
        long left1 = 2;
        long right1 = 5;
        var res1 = sl.solution(n1, left1, right1);

        for (int i = 0; i < res1.Length; i++)
        {
            Console.Write($"{res1[i]} ,");
        }

        Console.WriteLine();
        
        int n2 = 4;
        long left2 = 7;
        long right2 = 14;
        var res2 = sl.solution(n2, left2, right2);
        
        for (int i = 0; i < res2.Length; i++)
        {
            Console.Write($"{res2[i]} ,");
        }
    }
}

 

✅ 풀이 코드

피드백을 받은 부분을 정리하면 아래 2가지이다. 위에서 index를 줄일 수 있는 것도 생각했는데 생각해보니 for 돌릴 때 for문 안에서 인자를 넣기만 해도 되었었다는 것도 있었다. 그리고 Math.Max를 row, col 비교를 해도 생각해보니 같은 결과를 낼 수 있었겠구나라는 것을 알게 되었다.

문제의 피드백

🔄 정리

문제에서 주어진 규칙을 이해하고 구현할 수 있는지 체크하는 문제로 Math.Max 사용과 For 안의 인자로 규칙적으로 1씩 증가하는 index는 처리하는 것을 활용해보자

반응형