[Programmers][Java] n^2 배열 자르기

최지수·2022년 4월 10일
0

Algorithm

목록 보기
72/77
post-thumbnail

문제

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
1. nn열 크기의 비어있는 2차원 배열을 만듭니다.
2.i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
(1행 1열부터 ii열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.)
3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ n10710^7
  • 0 ≤ leftright < n2n^2
  • right - left < 10510^5

접근

단순 구현 문제로 보이지만 규칙을 찾아서 최적화된 알고리즘을 찾는 문제였어요. n의 개수가 최대 10710^7인데 2차원 배열을 구성하는 것부터 O(n2n^2)이기 때문에 시간초과가 발생하기 때문이에요.

처음에 각 배열의 위치가 row * n + col이라는 사실에 주목을 했어요. 그리고 이를 나열하면서 각 row와 col 중 가장 큰 수 + 1이 적절한 값이라는 규칙을 찾아냈어요!

이번 문제를 풀면서 운이 좋았다는 것도 있었지만, brute-force 방식보단 문제의 의도를 파악해서 단순화하면 생각보다 간단하게 문제를 풀 수 있겠다는 점을 느꼈어요. 시험칠 때 좀 이랬으면 좋겠어요 ㅎㅎ

답안

class Solution {
    public int[] solution(int n, long left, long right) {
        int[] answer = new int[(int)(right - left) + 1];

        int end = (int)(right - left);
        for(int i = 0; i <= end; ++i){
            long div = (left + i) / n;
            long mod = (left + i) % n;
            answer[i] = (int)Math.max(div + 1, mod + 1);
        }

        return answer;
    }
}
profile
#행복 #도전 #지속성

0개의 댓글

관련 채용 정보