| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 자바
- 1931번
- WPF
- 운전면허
- 코딩테스트
- level4
- 프로그래머스
- 백준
- 코테
- 씨샵
- Python
- MySQL
- level3
- MVVM
- 일반화
- level2
- WSL
- JPA
- c#
- 쿼리
- delegate
- programmers
- 스프링부트
- Java
- 닫기버튼
- SQL
- springboot
- 3일컷
- Spring Boot
- 보통2종
- Today
- Total
욱꾸미의 주꾸미 발
[코딩테스트] 백준(BAEKJOON) - 카드 정렬하기(Java, 1715번) 본문
안녕하세요~ 또 문제를 풀기위해 오늘도 왔습니다.
평일에 글을쓰는건 또 오랜만이네요~
다 저의 게으름 때문이기에 변명의 여지는 없습니다 ㅠㅠ
그럼 문제 바로 만나보겠습니다.
https://www.acmicpc.net/problem/1715
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
네~ 카드 정렬하기라는 문제입니다.
사실 이 문제는 계속 틀려서 풀이를 보고 풀었습니다.
정말 간단한 원리인데 이부분을 생각 못했더군요~
코드입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
Scanner sc=new Scanner(System.in);
PriorityQueue<Long> queue=new PriorityQueue<>();
int time=sc.nextInt();
for(int i=0;i<time;i++)
{
long number=sc.nextInt();
queue.add(number);
}
long sum=0;
long answer=0;
while(queue.size()>1)
{
sum=queue.poll()+queue.poll();
answer+=sum;
queue.add(sum);
}
System.out.print(answer);
}
}
하나씩 알아보시죠~
먼저 제가 생각한 핵심원리는
- 최소의 합을 계속 만들어야한다
- 그렇기에 PriorityQueue를 통해 최소의 수로 정렬한다. 입니다.
PriorityQueue<Long> queue=new PriorityQueue<>();
- PriorityQueue는 카드 뭉치들을 저장할 Queue입니다.
for(int i=0;i<time;i++)
{
long number=sc.nextInt();
queue.add(number);
}
- 다음은 카드 묶음들을 queue에 집어 넣겠습니다.
while(queue.size()>1)
{
sum=queue.poll()+queue.poll();
answer+=sum;
queue.add(sum);
}
- 아마 여기부분이 핵심 부분이 될 것 같네요
① queue.size가 1이라면 더이상 섞을 카드뭉치가 없기에 종료 합니다.
② 다음은 문제에서와 같이 최소의 카드 묶음 두 쌍을 섞기위해 더해줍니다.
③ 저에게는 이 부분이 핵심이었습니다. 저는 더한 값을 그대로 다시 재활용 했었는데
더한 카드 묶음또한 다시 Queue에 넣어 정렬이 되도록 해야합니다.
이렇게 풀어내시면 해당 문제 해결하실 수 있겠습니다.
감사합니다. 이번 문제 간단하셨을까요?
그럼 이만 마무리 하겠습니다.
감사합니다. 😊😊
'코딩테스트 > 백준' 카테고리의 다른 글
| [코딩테스트] 백준(BAEKJOON) - 촌수계산(Java, 2644번) (0) | 2023.06.30 |
|---|---|
| [코딩테스트] 백준(BAEKJOON) - 신입 사원(Java, 1946번) (0) | 2023.05.05 |
| [코딩테스트] 백준(BAEKJOON) - 30(Java, 10610번) (0) | 2023.05.01 |
| [코딩테스트] 백준(BAEKJOON) - 주유소(Java, 13305번) (0) | 2023.04.29 |
| [코딩테스트] 백준(BAEKJOON) - 전자레인지(Java, 10162번) (0) | 2023.04.29 |