https://softeer.ai/practice/6257/history?questionType=ALGORITHM
Softeer - ํ๋์๋์ฐจ๊ทธ๋ฃน SW์ธ์ฌํ๋ณดํ๋ซํผ
softeer.ai
์ฒ์ ์๊ฐํ ํ์ด๊ณผ์ ์ for๋ฌธ์ ์ธ ๋ฒ ์ฐ๋ ๊ฒ ์ด์๋๋ฐ, O(n^3)์ด์ด์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ๋ก์ง์ด์์ต๋๋ค.
ํ์ด๊ณผ์
i=0 ์ ๊ธฐ์ค์ผ๋ก ๋ก๋๋ค.
์ด๋ ๋ฐฐ์ด์ ๋์์ ๋ถํฐ ๋น๊ตํด์ผ ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
1๊ณผ 3์ arr[0] ์ ๊ฐ 4๋ณด๋ค ์์ผ๋ฏ๋ก 1์ฉ ๋์ ํด์ค๋๋ค.
๊ทธ ๋ค์ ์์ 5๋ arr[0] ๋ณด๋ค ํฝ๋๋ค.
๋ฐ๋ผ์ 1์ ๋์ ํ์ง ์๊ณ ๊ทธ๋๋ก 2๋ฅผ ์ ๋ ฅํฉ๋๋ค.
๋ํ arr[0]๋ณด๋ค 5๊ฐ ํฌ๊ธฐ๋๋ฌธ์, ์คํ์ ๋ ฌ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ ์ ๋๋ค.
answer ์ ๋์ ๋ ๊ฐ 2๋ฅผ ๋์ ํด์ค๋๋ค.
๊ทธ ๋ค์ ์์ 2๋ arr[0]๋ณด๋ค ์์ผ๋ฏ๋ก 1์ ๋์ ํด์ค๋๋ค.
์ ๊ณผ์ ์ i=1, i=2, ... i=N-1 ๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
static void solve(){
for(int i=0;i<N;i++){ // map๋ฐฐ์ด ์ด๊ธฐํ์ํค๊ธฐ (map[i][j] = map[i][j+1] + 1์ ํ๊ธฐ ๋๋ฌธ์ ์ฒ์์ ์ด๊ธฐํ๋ฅผ ์์ผ์ค์ผ ํจ)
if(arr[i] > arr[N-1]){
map[i][N-1] = 1;
}
}
for(int i=0;i<N;i++){
for(int j=N-2;j>=i+1;j--){
if(arr[i] > arr[j]){
map[i][j] = map[i][j+1] + 1;
}else if(arr[i] == arr[j]){
map[i][j] = map[i][j+1];
}else if(arr[i] < arr[j]){
answer += map[i][j+1]; // map[i][j+1] ์ด 1000 ์ ๋๋ผ๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ์ต์
์ ๊ฒฝ์ฐ 5000 * 5000 * 1000 ์ผ๋ก 20์ต์ ๋์ด๊ฐ ๋ฐ๋ผ์ long์๋ฃํ์ ์ฌ์ฉํด์ผ ํจ.
map[i][j] = map[i][j+1];
}
}
}
}
์ด๋ answer์ intํ์ด ์๋ longํ์ผ๋ก ๋ฌ์ผํฉ๋๋ค.
answer์ ๋จ์ํ +1 ์์ผ์ฃผ๋ ๊ฒ์ด ์๋ map๋ฐฐ์ด์ ์์๊ฐ์ ๋์ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
5000 * 5000 = 25,000,000 ์ผ๋ก intํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์์ต๋๋ค.
answer์ map๋ฐฐ์ด์ ์์๊ฐ์ ๋์ ์์ผ ์ฃผ๊ธฐ ๋๋ฌธ์ longํ์ผ๋ก ๋ฌ์ผ ํฉ๋๋ค.
map[i][j+1] ์ ์ฝ 1000์ด๋ผ๋ฉด, ์ต์ ์ ๊ฒฝ์ฐ 5000 * 5000 * 1000 ์ผ๋ก intํ์ ๋ฒ์ 20์ต์ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๊ฒ๋ ์
- ๋ฐฐ์ด์ ์์๋ฅผ ์์์ ํ์ํ ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค๋ฉด, ๋ค์์ ๋ถํฐ ํ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ ์ฌ๋ ค๋ณด์.
- ๋ฐ๋ณต๋ฌธ๋ง ๋ณด๊ณ ์๋ฃํ์ ํฌ๊ธฐ๋ฅผ ์ ํ๋ฉด ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ฐ๋ณต๋ฌธ ์์ ๊ฐ์ ๋์ ์ํค๋ ๊ฒฝ์ฐ ์๋ฃํ์ ํฌ๊ธฐ๋ฅผ ๋ฒ์ด๋ ์ ์์ต๋๋ค.
- ๋ก์ง์ด ๋ง๋๋ฐ ์๊พธ ํ๋ฆฐ๋ค๋ฉด, intํ์ long์ผ๋ก ๋ฐ๊ฟ๋ณด์.
์ ์ฒด์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[] arr;
static int[][] map;
static long answer;
static void solve(){
for(int i=0;i<N;i++){
if(arr[i] > arr[N-1]){
map[i][N-1] = 1;
}
}
for(int i=0;i<N;i++){
for(int j=N-2;j>=i+1;j--){
if(arr[i] > arr[j]){
map[i][j] = map[i][j+1] + 1;
}else if(arr[i] == arr[j]){
map[i][j] = map[i][j+1];
}else if(arr[i] < arr[j]){
answer += map[i][j+1]; // map[i][j+1] ์ด 1000 ์ ๋๋ผ๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ์ต์
์ ๊ฒฝ์ฐ 5000 * 5000 * 1000 ์ผ๋ก 20์ต์ ๋์ด๊ฐ ๋ฐ๋ผ์ long์๋ฃํ์ ์ฌ์ฉํด์ผ ํจ.
map[i][j] = map[i][j+1];
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
arr = new int[N];
answer = 0;
for(int i=0;i<N;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
map = new int[N][N];
solve();
System.out.println(answer);
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2024 ์ผ์ฑSW์ญ๋ํ ์คํธ ํ๋ฐ๊ธฐ ์ค์ 1๋ฒ (0) | 2024.12.02 |
---|---|
์์ด(n๊ณผm ๋ฌธ์ ) ์ต์ ํ ์ํค๊ธฐ && ์กฐํฉ (0) | 2024.10.29 |
[HSAT 1ํ ์ ๊ธฐ ์ฝ๋ฉ ์ธ์ฆํ๊ฐ ๊ธฐ์ถ] ๋ก๋ด์ด ์ง๋๊ฐ ๊ฒฝ๋ก (0) | 2024.06.28 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์๋ด์ ์ธ์ (0) | 2024.06.26 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ (0) | 2024.06.24 |