목록백준 (12)
우보천리 개발
백준 2110 공유기 설치 https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가 www.acmicpc.net 아이디어 집의 좌표가 입력으로 최대 10억개 들어올 수 있기에 시간초과에 걸릴 수 있다 이진탐색을 사용하면 매번 데이터의 개수를 절반으로 줄일 수 있기 때문에 이분탐색으로 풀어나간다 우선 좌표를 오름차순으로 정렬해야 이진탐색 가능 공유기 사이의 최소길이는 1이다. 최대길이는 배열의 가장 큰 값이다 공유기 배치를 주어진 ..
백준 1715 카드 정렬하기 https://www.acmicpc.net/problem/1715 1715번: 카드 정렬하기 정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장 www.acmicpc.net 아이디어 카드를 최소한의 비교로 합치기 위해서는 매번 묶음의 개수가 가장 적은 것들을 더해주면 된다 우선순위큐를 사용하여 매번 가장 낮은 숫자들을 더하면 결과를 확인할 수 있다 코드 import java.util.*; class BJ1715 { public static void main(String[] args) { Scanner sc = new Scan..
백준 10825 국영수 https://www.acmicpc.net/problem/10825 10825번: 국영수 첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1 www.acmicpc.net 아이디어 Comparator 을 재정의해서 문제에서 요구하는 기준으로 정렬을 하면 되는 문제이다 코드 import java.io.*; import java.util.*; class BJ10825 { // 문제에서 요구하는 점수와 이름을 저장하는 클래스를 정의하는데 // 정렬 기준을 정의해야하기 때문에 Comparable 클래스 구현 static clas..
백준 14888 연산자 끼워넣기 문제 https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, www.acmicpc.net 아이디어 사칙연산이 순서대로 주어지기 때문에 사칙연산의 개수를 담는 배열을 만든다 이후 사칙연산의 조합을 재귀적으로 호출하여 모든 경우의 수를 확인한다 마지막에 사용한 사칙 연산의 개수를 다시 증가시켜줘야한다 코드 import java.util.*; class BJ14888 { static int[] ma..
백준 14502 연구소 문제 https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 아이디어 벽을 3개 세워야하는데 DFS를 통해서 연구소 내에 벽 3개를 세울 수 있는 경우의 수에 대해서 모두 계산한다 벽을 3개 세웠으면 바이러스가 퍼져야하는데, BFS를 통해서 주변에 벽에 없는 곳으로 바이러스가 퍼질 것이다 매번 바이러스가 없는 영역을 구해서 최대값으로 갱신한다 DFS + BFS를 사용해서 풀기 코드 import java.util.*; class BJ1450..
백준 7576 토마토 https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 아이디어 BFS로 탐색을 하는데, 익은 토마토와 인접한 곳부터 익어야하기 때문에 큐에 익은 토마토를 미리 다 넣어준다. 2차원 배열로 만들어서 탐색하는데, 1인 곳은 새로 정의한 Tomato 클래스로 미리 큐에 넣는다 그렇게 되면 1과 인접한 곳부터 모두 탐색하는데 0이 아닌곳은 탐색하지 않음 마지막에 배열을 확인해서 익지 않은 토마토가 있는지, 아니면 모두 ..
백준 1325 효율적인 해킹 https://www.acmicpc.net/problem/1325
백준 18352 특정 거리의 도시 찾기 https://www.acmicpc.net/problem/18352 18352번: 특정 거리의 도시 찾기 첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개 www.acmicpc.net 아이디어 BFS 알고리즘을 활용하여 시작 도시와 인접한 도시까지의 거리를 구하며 계속 거리를 구해나간다 방문 배열을 만들어 거리를 업데이트한다 처음 거리는 0이고 그 이후 거리는 1만큼 늘어나기 때문에 이전 값에서 +1 해준 값으로 갱신해준다 코드 package baekjoon; imp..
백준 1744 수 묶기 문제 https://www.acmicpc.net/problem/1744 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net 아이디어 양수*양수, 음수*음수 를 통해서 가장 큰 값을 도출 할 수 있다 물론 가장 큰 양수끼리의 곱, 그리고 가장 작은 음수 끼리의 곱이다 1의 경우 마지막에 더해주는 방식이 가장 큰 값을 만들 수 있다. 0은 음수가 총 홀수개 있다면 마지막으로 큰 음수에 곱해주면 되고 그렇지 않다면 나머지 음수는 그냥 더해주어야한다 PriorityQueue를 사용해서 양수, 음..
백준 1715 카드 정렬하기 문제 https://www.acmicpc.net/problem/1715 1715번: 카드 정렬하기 정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장 www.acmicpc.net 아이디어 문제의 예시에도 나와있듯이 최소한으로 비교하기 위해서는 가장 작은 값끼리 먼저 더해야한다 즉 10, 20, 40이면 (10+20) + (30+40) 을 해야함 계속해서 작은 값을 먼저 더해야되기 때문에 PriorityQueue 우선순위큐를 사용하면 된다 코드 package baekjoon; import java.util.*; class BJ..