전공공부
[BOJ_20366] 같이 눈사람 만들래? 본문
설명
2가지의 경우의 수를 먼저 고르고 O(N*N) 그리고 이때 투 포인터로 하나의 경우를 더 찾는 로직으로 눈사람을 설치 할 수 있다.
처음에 for문으로 투 포인터 방식을 생각하다가 잘 못 짜서 S는 무조건 상승하는 방식의 로직으로 구성해서 틀렸습니다가 많이 떴다. 생각해보면 S의 경우도 당연히 조건에 따라서 움직여야 하는데 생각이 얕아 고생을 했던 문제
총 시간 복잡도 : O(N^3)
코드
package two_pointer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class BOJ_20366 {
static int ans = Integer.MAX_VALUE;
static List<Integer> snowList;
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(in.readLine());
snowList = new ArrayList<Integer>();
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
for (int i = 0; i < N; i++){
snowList.add(Integer.parseInt(tk.nextToken()));
}
Collections.sort(snowList);
solve(N);
System.out.println(ans);
}
private static void solve(int N) {
int A = 0;
int B = 0;
int S = 0;
int E = 0;
for (int i = 0; i < N; i++){
A = i;
for (int j = i + 1; j < N; j++){
S = 0;
B = j;
E = N - 1;
while(S < E){
if(S == A || S == B){
S++;
continue;
}
if(E == A || E == B){
E--;
continue;
}
ans = Math.min(ans, Math.abs((snowList.get(A) + snowList.get(B)) - (snowList.get(S) + snowList.get(E))));
if((snowList.get(A) + snowList.get(B)) < (snowList.get(S) + snowList.get(E))) {
E--;
}
else{
S++;
}
}
}
}
}
}
20366번: 같이 눈사람 만들래?
높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1
www.acmicpc.net
'Study > Problem Solving' 카테고리의 다른 글
[BOJ_1647] 도시 분할 계획 (0) | 2024.01.08 |
---|---|
[BOJ_20442] ㅋㅋ루ㅋㅋ (0) | 2024.01.07 |
[BOJ_1325] 효율적인 해킹 (2) | 2024.01.05 |
[BOJ_16918] 봄버맨 (2) | 2024.01.05 |
[BOJ_22945] 팀 빌딩 (2) | 2024.01.05 |