https://school.programmers.co.kr/learn/courses/30/lessons/87390?language=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⁷
- 0 ≤ left ≤ right < n²
- right - left < 10⁵
문제풀이
문제는 2차원 배열을 특정 방식으로 생성 후, 해당 배열의 일부 구간을 추출해야 합니다. 즉, 일부 구간만 구하면 되기 때문에 전체 배열을 생성하지 않고, 필요한 구간의 값을 효율적으로 구하는 방법을 사용합니다.
주어진 n의 크기의 2차원 배열을 다음과 같이 정의할 수 있습니다.

- arr[i][j] = max(i, j) + 1
1차원 배열 index를 2차원 배열의 좌표 변환 및 값 계산 공식은 다음과 같습니다.
- 행(row): index / n (index를 배열의 너비로 나눈 몫)
- 열(col): index % n (index를 배열의 너비로 나눈 나머지)
- 2차원 배열의 (row, col) 위치의 값은 max(row, col) + 1
예를 들어 n = 3, left = 2, right = 5인 경우
- index 2:
- row = 2 / 3 = 0
- col = 2 % 3 = 2
- arr[0][2] = max(0, 2) + 1 = 3
- index 3:
- row = 3 / 3 = 1
- col = 3 % 3 = 0
- arr[1][0] = max(1, 0) + 1 = 2
- index 4:
- row = 4 / 3 = 1
- col = 4 % 3 = 1
- arr[1][1] = max(1, 1) + 1 = 2
- index 5:
- row = 5 / 3 = 1
- col = 5 % 3 = 2
- arr[1][2] = max(1, 2) + 1 = 3
index 2 ~ 5까지의 1차원 배열로 나타내면 [3, 2, 2, 3]입니다.
위 개념을 바탕으로 코드에 적용하면 다음과 같습니다.
class Solution {
public int[] solution(int n, long left, long right) {
int l = (int) (right - left + 1);
int[] answer = new int[len];
for (int i = 0; i < l; i++) {
long index = left + i;
int row = (int) (index / n);
int col = (int) (index % n);
answer[i] = Math.max(row, col) + 1;
}
return answer;
}
}
공간 복잡도: 0(right - left + 1) 또는 0(10⁵)
시간 복잡도: 0(right - left + 1) 또는 0(10⁵)
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 15990번: 1, 2, 3 더하기 5 (0) | 2025.01.13 |
---|---|
백준 2563번: 색종이 (0) | 2024.08.28 |
프로그래머스 할인 행사 (0) | 2024.05.07 |
프로그래머스 괄호 회전하기 (0) | 2024.05.06 |
프로그래머스 귤 고르기 (0) | 2024.04.29 |
https://school.programmers.co.kr/learn/courses/30/lessons/87390?language=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⁷
- 0 ≤ left ≤ right < n²
- right - left < 10⁵
문제풀이
문제는 2차원 배열을 특정 방식으로 생성 후, 해당 배열의 일부 구간을 추출해야 합니다. 즉, 일부 구간만 구하면 되기 때문에 전체 배열을 생성하지 않고, 필요한 구간의 값을 효율적으로 구하는 방법을 사용합니다.
주어진 n의 크기의 2차원 배열을 다음과 같이 정의할 수 있습니다.

- arr[i][j] = max(i, j) + 1
1차원 배열 index를 2차원 배열의 좌표 변환 및 값 계산 공식은 다음과 같습니다.
- 행(row): index / n (index를 배열의 너비로 나눈 몫)
- 열(col): index % n (index를 배열의 너비로 나눈 나머지)
- 2차원 배열의 (row, col) 위치의 값은 max(row, col) + 1
예를 들어 n = 3, left = 2, right = 5인 경우
- index 2:
- row = 2 / 3 = 0
- col = 2 % 3 = 2
- arr[0][2] = max(0, 2) + 1 = 3
- index 3:
- row = 3 / 3 = 1
- col = 3 % 3 = 0
- arr[1][0] = max(1, 0) + 1 = 2
- index 4:
- row = 4 / 3 = 1
- col = 4 % 3 = 1
- arr[1][1] = max(1, 1) + 1 = 2
- index 5:
- row = 5 / 3 = 1
- col = 5 % 3 = 2
- arr[1][2] = max(1, 2) + 1 = 3
index 2 ~ 5까지의 1차원 배열로 나타내면 [3, 2, 2, 3]입니다.
위 개념을 바탕으로 코드에 적용하면 다음과 같습니다.
class Solution {
public int[] solution(int n, long left, long right) {
int l = (int) (right - left + 1);
int[] answer = new int[len];
for (int i = 0; i < l; i++) {
long index = left + i;
int row = (int) (index / n);
int col = (int) (index % n);
answer[i] = Math.max(row, col) + 1;
}
return answer;
}
}
공간 복잡도: 0(right - left + 1) 또는 0(10⁵)
시간 복잡도: 0(right - left + 1) 또는 0(10⁵)
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 15990번: 1, 2, 3 더하기 5 (0) | 2025.01.13 |
---|---|
백준 2563번: 색종이 (0) | 2024.08.28 |
프로그래머스 할인 행사 (0) | 2024.05.07 |
프로그래머스 괄호 회전하기 (0) | 2024.05.06 |
프로그래머스 귤 고르기 (0) | 2024.04.29 |