[PS] 99ํด๋ฝ ์ฝํ ์คํฐ๋ 1์ผ์ฐจ TIL (n^2 ๋ฐฐ์ด ์๋ฅด๊ธฐ)
ํ๊ทธ: 99ํด๋ฝ, PS, TIL, ๋ฐฐ์ด, ์ฝ๋ฉํ ์คํธ์ค๋น, ํญํด99
์นดํ ๊ณ ๋ฆฌ: PS
๋ฌธ์
ํ์ด
์ฒซ๋ฒ์งธ ํ์ด (๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
class Solution {
public int[] solution(int n, long left, long right) {
// 1. 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ ์ธํ
int[][] arr = new int[n][n];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
arr[i - 1][j - 1] = Math.max(j, i);
}
}
// 2. 2์ฐจ์ ๋ฐฐ์ด -> 1์ฐจ์ ๋ฐฐ์ด
int[] tmp = new int[arr.length * arr[0].length];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
tmp[arr[i].length * i + j] = arr[i][j];
}
}
// 3. ์ธ๋ฑ์ค ๋ฒ์๋ง ๊ฐ์ ธ์ค๊ธฐ
int[] result = Arrays.copyOfRange(tmp, (int) left, (int) right + 1);
return result;
}
}
์ฒ์ ์์ฑํ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ก ํต๊ณผํ์ง ๋ชปํ๋ค. ๊ฐ๋ตํ๊ฒ ์ฝ๋๋ฅผ ์ค๋ช ํ์๋ฉด,
1๋ฒ ์ฃผ์์์, ๋ฐฐ์ด์ ๋ง๋ค์ด n = 1 ~ n ์ ๋ชจ๋ ๊ฐ์ ์ ์ฅํ๋ค. ์ด๋, ํ๊ณผ ์ด์ ์ธ๋ฑ์ค๋ฅผ ๋น๊ตํด ๋ ์ค ํฐ ๊ฐ์ ๋ฃ๋๋ค. arr ๋ฐฐ์ด์๋ ์๋ ์ฒ๋ผ ๋ค์ด๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
1
2
3
4
5
// n = 3
[[1, 2, 3], [2, 2, 3], [3, 3, 3]]
// n = 4
[[1, 2, 3, 4], [2, 2, 3, 4], [3, 3, 3, 4], [4, 4, 4, 4]]
2๋ฒ ์ฃผ์์์, ๋ฌธ์ ์์ ์๊ตฌํ๋ ๊ฒ์ฒ๋ผ 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก ํฉ์น๋ค.
1์ฐจ์ ๋ฐฐ์ด์ ๊ธธ์ด๋ 2์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ธธ์ด * ๊ฐ ์ด์ ๊ธธ์ด
๋ก ์ค์ ํ ์ ์๋ค.
๊ฐ ์ธ๋ฑ์ค์ ๋ค์ด๊ฐ์ผ ํ ๊ฐ์ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ท์น์ด ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
// n ์ด 4์ผ๋
tmp[4] = arr[1][0]
tmp[5] = arr[1][1]
tmp[6] = arr[1][2]
tmp[7] = arr[1][3]
...
// 4 = n * 1 + 0
// 5 = n * 1 + 1
// 6 = n * 1 + 2
// 7 = n * 1 + 3
...
// x = n * i + j
3๋ฒ ์ฃผ์์์, ๋ฌธ์ ์์ ์๊ตฌํ๋ left ๋ถํฐ right ๋ฒ์๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด Arrays.copyOfRange() ๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ ์ด ์ฝ๋๋ ์คํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋์จ๋ค. ๋ฌธ์ ์์ n ์ ๋ฒ์๊ฐ 10^7 ์ด๊ธฐ ๋๋ฌธ์ 1๋ฒ ์ฃผ์์์ 10^7 * 10^7 ์ด ๋์ด ๋ฌด๋ ค 100์กฐ๋ฒ ๊ณ์ฐํด์ผ ํ๋ค. ์ด๋ฅผ ์์ ๊ฐ์ด O(n^2) ๋ก ํ๊ฒ๋๋ฉด ๋๋ต 100๋ง์ด๊ฐ ๊ฑธ๋ฆฐ๋คโฆ (1์ด์ 10^8 ๋ฒ ์ฐ์ฐํ๋ค๊ณ ๊ฐ์ .)
๋๋ฒ์งธ ํ์ด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
class Solution {
public int[] solution(int n, long left, long right) {
int len = (int) (right - left + 1);
int[] result = new int[len];
for (int i = 0; i < len; i++) {
long pos = left + i;
int row = (int) (pos / n);
int col = (int) (pos % n);
result[i] = Math.max(row, col) + 1;
}
return result;
}
}
์ผ๋จ ์ฒซ๋ฒ์งธ ํ์ด์์ ์ด์ค for ๋ฌธ์ ์์ ์ผ ํ๋ค. ๊ฒฐ๊ตญ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ์ ์ธํ ํ๋ ๊ณผ์ ์ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ์ถ๋ ฅํด์ผ ํ๋ค๋ ๋ป์ด๋ค.
1
2
3
4
5
6
7
8
9
// n = 4, left = 7 ์ผ๋
result[7] = 4 // (7 + 0) / 4 = 1...3
result[8] = 3 // (7 + 1) / 4 = 2...0
result[9] = 3 // (7 + 2) / 4 = 2...1
result[10] = 3 // (7 + 3) / 4 = 2...2
result[11] = 4 // (7 + 4) / 4 = 2...3
...
// result[x] = (/ ์ฐ์ฐ) or (% ์ฐ์ฐ) ๊ฒฐ๊ณผ ์ค ํฐ ๊ฐ + 1
์ฌ์ค ๋ฌธ์ ์์ n ์ ๋ฒ์ ์กฐ๊ฑด๋ง ํ์ธํด๋ ์ด๋ป๊ฒ ํ์ด์ผ ๋ ์ง ๊ฐ์ ์ก์ ์ ์์์ ํ ๋ฐ, ์๊ฐ๋ณต์ก๋ ๊ณ์ฐ์ ํ๋ ๊ฒ์ด ์ต์ํ์ง ์์์ ํญ์ ์ด๋ ๊ฒ ํ๋ฆฌ๊ณ ๋์ ์์ ํ๊ณค ํ๋๋ฐ.. ์๊ฐ๋ณต์ก๋์ ์ข ๋ฅ๋ ๋๋ต์ ์ธ ๊ณ์ฐ ๋ฐฉ๋ฒ ๋ฑ์ ์ข ๋ ํ์ตํด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ