728x90
코딩테스트 연습 - n^2 배열 자르기
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부
programmers.co.kr
📝 문제 설명
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n행n열 크기의 비어있는 2차원 배열을 만듭니다.i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.- 1행 1열부터
i행i열까지의 영역 내의 모든 빈 칸을 숫자i로 채웁니다.
- 1행 1열부터
- 1행, 2행, ...,
n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. - 새로운 1차원 배열을
arr이라 할 때,arr[left],arr[left+1], ...,arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
⚠️ 제한사항
- 1 ≤
n≤ 107 - 0 ≤
left≤right< n2 left-right< 105
🖨 입출력 예
| n | left | right | result |
|---|---|---|---|
| 3 | 2 | 5 | [3,2,2,3] |
| 4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
📂 분류
구현
💡 풀이
n이 최대 107까지 주어지므로 2차원 배열을 만들어 구현하는 방식으로는 문제를 해결하지 못한다.
따라서 2차원 배열을 직접 구현하지 않고 1차원 배열을 이용해 문제를 풀어야 한다. 여기서 n x n 배열일 때, (i / n) + 1 은 행의 값이 되고, (i % n) + 1은 열의 값이 된다.
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 |
| 1 | 2 | 2 | 3 | 4 |
| 2 | 3 | 3 | 3 | 4 |
| 3 | 4 | 4 | 4 | 4 |
위 행렬을 보면 arr[row][col]는 row와 col 중 큰 값 + 1이 되는 것을 알 수 있다.
따라서 left부터 right까지 반복하면서 answer에 max(row, col) + 1을 저장해주면 된다.
💻 코드
public class Solution {
public int[] solution(int n, long left, long right) {
int len = (int) right - (int) left;
int[] answer = new int[len + 1];
int idx = 0;
for (long i = left; i <= right; i++) {
long row = i / n;
long col = i % n;
answer[idx++] = Math.max((int)row, (int)col) + 1;
}
return answer;
}
}728x90
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [Java] 프로그래머스 Lv2 - 스킬트리 (0) | 2022.04.15 |
|---|---|
| [Java] 프로그래머스 Lv2 - 쿼드압축 후 개수 세기 (1) | 2022.04.13 |
| [Java] 프로그래머스 - 로또의 최고 순위와 최저 순위(Level 1) (0) | 2022.04.10 |
| [Java] 프로그래머스 - 점프와 순간 이동 (Level 2) (1) | 2022.04.09 |
| [JAVA 풀이] 프로그래머스 - 이진 변환 반복하기 (Level2) (0) | 2022.04.07 |