티스토리 뷰
https://www.acmicpc.net/problem/20366

문제
언니! 똑...똑똑...똑똑! 같이 눈사람 만들래~? ♪
언니 엘자와 동생 안나에게는 N개의 눈덩이가 있다. 각 눈덩이 i (1 ≤ i ≤ N)의 지름은 Hi 이다. 하나의 눈사람은 두 개의 눈덩이로 구성되며, 눈덩이 하나를 아래에 두고 그 눈덩이보다 크지 않은 다른 눈덩이를 쌓아올리는 방식으로 만들 수 있다. 이때, 눈사람의 키는 두 눈덩이 지름의 합과 같다.
엘자와 안나는 눈덩이 N개 중 서로 다른 4개를 골라서 눈사람을 각각 1개씩, 총 2개를 만들려고 한다. 두 자매는 두 눈사람의 키의 차이가 작을수록 두 눈사람의 사이가 좋을 것이라고 믿는다. 우리는 엘자와 안나가 가장 사이좋은 두 눈사람을 만들기 위해서 도와주려고 한다.

주어진 N개의 눈덩이를 이용하여 만들 수 있는 두 눈사람의 키 차이 중 최솟값을 구하는 프로그램을 작성하시오.
유형 : 투 포인터
접근 방식
- 단순하게 문제를 접근하자면 N개의 수에서 4개를 뽑아서 |(x1 + x2) - (x3 + x4)| 의 최솟값을 구하는 문제이다.
- N의 범위를 고려하여 문제를 해결하기 위해서 O(N^3)의 풀이법을 생각했고 투 포인터를 사용하면 된다.
- 우선 N개의 수를 정렬한다.
- N개의 수에서 2개를 뽑는다.
- 뽑은 수가 아닌 2개의 수를 투 포인터를 통해 찾는다.
- 앞서 뽑은 2개의 수의 합과 최대한 근접한 수를 찾도록 조건문을 설정하면 된다.
전체 코드
import java.util.*;
import java.io.*;
public class Main {
static int n;
static int[] board;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
n = Integer.parseInt(st.nextToken());
board = new int[n];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < n ; i++){
board[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(board);
for(int i = 0 ; i < n - 1 ; i++){
for(int j = i+1; j < n ; j++){
int tmpSum = board[i] + board[j];
find(i,j,tmpSum);
}
}
System.out.println(result);
br.close();
}
static int result = Integer.MAX_VALUE;
static void find(int tmpX,int tmpY,int tmpSum){
int l = 0;
int r = n - 1;
while(l < r){
while(l == tmpX || l == tmpY){
l++;
}
while(r == tmpY || r == tmpX){
r--;
}
if(l >= r){
break;
}
int tmp = board[l] + board[r];
if(tmp == tmpSum){
result = 0;
break;
}else if(tmp > tmpSum){
result = Math.min(result, Math.abs(tmp - tmpSum));
r--;
}else{
result = Math.min(result, Math.abs(tmp - tmpSum));
l++;
}
}
}
static void print(){
for(int i = 0 ; i < n ; i++){
System.out.print(board[i]+" ");
}
System.out.println();
}
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 18128 (치삼이의 징검다리 건너기) - java (0) | 2024.05.09 |
|---|---|
| 백준 28019 (산지니의 여행계획) - java (0) | 2024.05.09 |
| 백준 20420 (화살표 미로 (Normal)) - java (0) | 2024.05.07 |
| 백준 18116 (로봇 조립) - java (1) | 2024.04.28 |
| 백준 13907 (세금) - java (0) | 2024.04.25 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #1987 #알파벳 #자바 #java
- 백준
- 백준 #16973 #직사각형 탈출
- 백준 #인구 이동 #16234
- 백준 #13549 #숨바꼭질3
- 백준 #12014 #주식 #자바 #java
- Java
- 백준 #치즈 #2638
- 백준 #1325 #효율적인 해킹
- 백준 #2580 #스도쿠
- 백준 #4963 #섬의 개수
- 자바
- 행복합시다.
- 17218
- 백준 #2636 #치즈
- 백준 #다리 만들기 #2146
- 올해보다
- 백준 #17940 #주식 #자바 #java
- 백준 #1759 #암호 만들기
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #
- 자바 #JAVA
- 백준 #18405 #경쟁적 전염
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #15686 #치킨 배달
- 백준 #3980 #선발 명단
- 17394
- 백준 #1584 #게임 #java #자바
- 백준 #5721 #사탕 줍기 대회 #java #자바
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함