일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 여행계획
- Android
- 보안취약점
- bytecode
- 보안
- 치유
- 여행
- Shared Elements
- throws
- Interface
- Navigation Component
- bytecode 분석
- 취약점
- 회피
- 심리여행
- 버킷리스트
- Transition
- extends
- static
- ㅇ
- javap
- HelloWorld
- IMPLEMENT
- abstract
- Recylcer
- 심리학
- 일상회피
- 일상탈출
- opcode
- jvm
- Today
- Total
패스트터틀
(Baekjoon) GreedyAlgorithm - (17) 저울 본문
https://www.acmicpc.net/problem/2437
2437번: 저울
하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓을 수 있고, 다른 쪽에는 무게를 측정하려는 물건만 올려놓을 수 있다. 무게가 양의 정수인 N개의 저울추가 주어질 때, 이 추들을 사용하여 측정할 수 없는 양의 정수 무게 중 최솟값을 구하는 프로그램을 작성하시오. 예를 들어, 무게가 각각 3, 1, 6, 2, 7, 30
www.acmicpc.net
= weight[] = 3 1 6 2 7 30 1
1) 우선 오름차순으로 정렬을한다.
= 1 1 2 3 6 7 30
2) 숫자 1이 들어있지않다면 답은 1 아니라면 연속성을 살펴본다.
예를들어서 1 1 2 3 4 4 , n과 n+1 관계에서 (n+1 - n) <= 1 라고 한다면 연속성이 성립한다고 볼수있다.
ex) 1123 , 23444 , 1111223, 1234567
3) 연속성이 성립되지 않는곳까지 탐색한다.
= 1 1 2 3 까지 연속성이 성립 6부터 성립안함
4) 1 1 2 3 까지를 전부더한다. 이것을 sum에다가 넣는다. 그리고 값 3의 index를 pivot으로 정한다.
= pivot = 3, sum = 7
5) pivot = 3 + 1 부터 검사를 시작한다.
pivot = 4 -> weight[4] = 6 이다. 해당값이 sum+1보다 크다면 그값은
연속적이지 않다. 그러므로 만들수없는 수가 생긴다.
6은 sum+1 = 8보다 작으므로 조건이 성립한다. 해당값과 sum을 더해서 sum에다가 넣는다.
(sum = 13)
pivot = 5 -> weight[5] = 7 이다. 해당값이 sum+1보다 크다면 그값은
연속적이지 않다. 그러므로 만들수없는 수가 생긴다.
7은 sum+1 = 14보다 작으므로 조건이 성립한다. 해당값과 sum을 더해서 sum에다가 넣는다.
(sum = 20)
pivot = 6 -> weight[6] = 30 이다. 해당값이 sum+1보다 크다면 그값은
연속적이지 않다. 그러므로 만들수없는 수가 생긴다.
30은 sum+1 = 20보다 크므로 조건이 성립하지 않는다. 그러므로 20 이상인 수는 만들수없다.
그러므로 답은 21이다.
이해가 가지 않는다면
1 1 2 3 6 7 30 을
1 1 2 3 9 10 20 으로 해보고 따져보고
1 1 2 3 6 7 20 으로 해보고 따져보자.
그러면 왜 내가 위와같이 풀었는지 알수있다.
다른사람들보다 코드가 난잡한데 결론적으로 다른사람들도 이와 비슷하게 풀었다.
package GreedyAlgorithm;
import java.util.Arrays;
import java.util.Scanner;
public class _2437 {
static int weight[];
static int pivot, sum;
static void ck_continuity() {
for (int i = 1; i < weight.length; i++) {
if (weight[i] - weight[i - 1] <= 1)
pivot = i;
else
break;
}
}
static void find_min() {
for (int i = pivot+1; i < weight.length; i++) {
if (weight[i] > (sum + 1)){
break;
}
else
sum += weight[i];
}
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
weight = new int[N];
for (int i = 0; i < N; i++) {
weight[i] = sc.nextInt();
}
Arrays.sort(weight);
if (Arrays.binarySearch(weight, 1) < 0) // 이진탐색으로 1이 없다면 1출력
System.out.println("1");
else if(N==1){
if(weight[0] != 1)
System.out.println("1");
else
System.out.println("2");
}
else{
ck_continuity(); // 연속성검사
for (int i = 0; i <= pivot; i++) {
sum += weight[i];
}
// for (int i = 0; i < weight.length; i++) {
// System.out.print(weight[i]+" ");
// }
// System.out.println();
// System.out.println("pivot : " + pivot + " sum : "+ sum );
if(pivot == weight.length-1)
System.out.println(sum+1);
else{
find_min();
System.out.println(sum+1);
}
}
sc.close();
}
}
백준문제풀이Github :
https://github.com/sdk0213/baekjoon-study
sdk0213/baekjoon-study
solve a baekjoon question. Contribute to sdk0213/baekjoon-study development by creating an account on GitHub.
github.com
'Algorithm > baekjoon' 카테고리의 다른 글
(Baekjoon) GreedyAlgorithm - (19) 멀티탭 스케줄링 (0) | 2019.12.30 |
---|---|
(Baekjoon) GreedyAlgorithm - (18) 수리공 항승 (0) | 2019.12.20 |
(Baekjoon) GreedyAlgorithm - (16) 병든 나이트 (0) | 2019.12.16 |
(Baekjoon) GreedyAlgorithm - (15) 한 줄로 서기 (0) | 2019.12.16 |
(Baekjoon) GreedyAlgorithm - (14) 반도체 설계 (0) | 2019.12.13 |