반응형
프로그래머스 n^2 배열 자르기 - JAVA
문제 설명
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
- n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
- i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
- 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
- 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
- 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 10^7
- 0 ≤ left ≤ right < n^2
- right - left < 10^5
문제 풀이
시물레이션에서 보여주는 것처럼 배열을 직접 만들고 거기서 정답을 뽑아오게 되면, 무조건 메모리 초과 혹은 시간 초과가 발행한다. 제한 사항의 주어진 n이 최대 10^7으로 n^2 크기의 배열을 만드는 것만으로도 비용이 매우 크다.
right - left는 최대 10^5 으로 이 범위만큼만 answer배열을 만들고 1차원 for문으로 해결해야 한다. 그러기 위해서 주어진 문제와 예제를 보며 분석해서 식을 세워야 한다.
예제 2번의 배열을 풀어보면 아래와 같다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | 4 |
위의 수를 나누거나 나머지 연산 했을떄 둘 중 큰 수에서 + 1을 하면 원하는 값을 찾을 수 있다.
ex) 7 / 4 = 2, 7 % 4 = 3 ==> 4 이다.
소스 코드
class Solution {
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int)(right - left) + 1];
for (int i = 0; i < answer.length; i++) {
int max = Math.max((int)((left + i) / n), (int)((left + i) % n));
answer[i] = max + 1;
}
return answer;
}
}
반응형
'알고리즘(Algorithm) > 프로그래머스(Programmers)' 카테고리의 다른 글
[프로그래머스] JadenCase 문자열 만들기 - JAVA (0) | 2021.11.09 |
---|---|
[프로그래머스] 전력망을 둘로 나누기 - JAVA (0) | 2021.11.08 |
[프로그래머스] 문자열 압축 - JAVA (0) | 2021.11.04 |
[프로그래머스] 직사각형 별찍기 - JAVA (0) | 2021.11.03 |
[프로그래머스] x만큼 간격이 있는 n개의 숫자 - JAVA (0) | 2021.11.03 |