[2025/07/17] TIL : 프로그래머스 문제 풀이

rain cloud·2025년 7월 17일
0

TIL

목록 보기
5/11
post-thumbnail

📕 정리

  • 프로그래머스 문제를 풀던 중 다차원 배열을 활용하여 특정배열의 범위를 제한하는 문제를 접하였음.
  • 쉽게 풀지 못하고, 다양한 시도를 하던 도중 풀이 방법을 알게 되었는데, 생각보다 훨씬 쉽게 풀 수 있었어서, 그 방법을 정리해보려고 함.

문제 : 프로그래머스 - 배열 만들기3

  • 문제

    • 정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어짐.
    • intervals는 항상 [[a1,b1], [a2,b2]]의 꼴로 주어지며 각 구간은 닫힌 구간. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미.
    • 이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return하는 solution함수를 만들어라.
    • https://school.programmers.co.kr/learn/courses/30/lessons/181895
  • 해결 시도

    • 일단 해결을 위해서 문제를 분석하는 것 부터 시작했다.
    • 분석을 위해 메모장에 이해한 바를 하나씩 적고, 명확히 구해야 할 것이 무엇이고, 어떻게 코드를 작성해나가면 좋을 지 기록하였다.
    • arr의 배열을 결국 출력하는 것이 문제이고, arr의 범위를 intervals의 0,0~0,1 의 범위, 그리고 1,0 ~ 1,1 의 범위 이렇게 각각 출력해서 이 둘의 결과값을 이으면 된다. 로 이해를 했다.
    public int[] solution(int[] arr, int[,] intervals)
    {
        int[] answer = new int[20];
        int count = (intervals[0, 1] - intervals[0, 0]) + 1;
        int count2 = (intervals[1, 1] - intervals[1, 0]) + 1;
    
        //intervals의 첫번째 0,0이 시작값이 되야하는거야. 끝범위는 i < 0,1 이 되야 하는거고. 그래서 출력을 answer[0] = arr[i])
        for (int i = 0; i < count; i++)
        {
    
            for (int j = intervals[0, 0]; j <= intervals[0, 1]; j++)
            {
                answer[i] = arr[j];
            }
    
        }
    
        for (int i = 0; i < count2; i++)
        {
            for (int j = intervals[1, 0]; j <= intervals[1, 1]; j++)
            {
                answer[i + count] = arr[j];
            }
        }
    
        return answer.Take(count + count2).ToArray(); // 배열의 크기를 조정하여 반환
    }
    • 작성한 메모를 바탕으로 작성한 코드이다.
    • 당연히 잘 작동될리는 없었고, 이렇게 1차적으로 작성한 코드를 대상으로 문제를 파악해보았다.
    • intervals의 행이 0일때와 1일때를 각각 for문으로 나눠서 따로 만들고, 그 출력값들을 서로 더하는 방식으로 출력하려고 코드를 작성했다.
    • 문제는 이중 반복문을 쓰는 바람에 i가 0임에도 j의 for문이 전부 반복해버리는 문제가 발생해버렸다.
    • 즉 문제는, 안쪽 루프가 계속해서 같은 answer[i] 값만 덮어씌운게 문제였다.
  • 해결

    • arr 배열의 출력에 대해 이중 for문을 사용하지 않고 다른 방법을 찾아야 했다.
    • 코드를 작성할 때 중요한 것은 패턴을 찾는 것이다.
    • 파악한 패턴으로는 intervals의 열의 범위가 0,1 이고 행의 범위도 0,1 이다.
    • 겉의 for문으로 intervals의 행을 반복으로 설정하고, 행이 0일때 열을 0,1 둘다 반복할 수 있게 해준다면, 문제를 해결할 수 있을 것이다.
    using System;
    using System.Collections.Generic;
    
    public class Solution {
        public int[] solution(int[] arr, int[,] intervals)
        {
            List<int> answer = new List<int>();
    
            for (int k = 0; k < 2; k++) // intervals의 두 줄 반복
            {
                int start = intervals[k, 0];
                int end = intervals[k, 1];
    
                for (int i = start; i <= end; i++)
                {
                    answer.Add(arr[i]);
                }
            }
    
            return answer.ToArray(); // List를 다시 배열로
        }
    }
    
    • 이렇게 겉의 for문은 intervals의 행의 반복을 나타내게 하였고, 열은 0과 1뿐이라서 그냥 start 변수와 end변수에 넣어주었다.
    • start를 시작값, end값을 마지막 인덱스값으로 설정을 해주고 리스트로 선언한 answer에 .Add를 활용해서 차례대로 추가해준다.

배운점

  • 일단 아무리 복잡한 문제여도, 일단 분석해서 작은단위로 만든다음에, 패턴이 있는지 파악하는것이 중요하다는 것을 알게 되었던것 같다.
  • 물론 모든 문제에서 통할지는 모르겠지만 우선 모르는 문제가 있으면 이렇게 적용을 먼저 해보면 좋을 것 같다.
  • 그리고 배열과 리스트 문제에서 배열을 사용할지 리스트를 사용할지 너무 헷갈리는 경우가 많다.
  • 일단 출력해야하는 값의 크기가 정해져 있는지를 먼저 파악하고, 출력을 해야할 때 다양한 요소를 고려해야 하거나 복잡한 것 같으면 리스트를 고려해보는 것도 좋을 것다.
profile
게임 개발, 기획

0개의 댓글