본문 바로가기

그리디6

Programmers - 사라지는 발판(Java) https://programmers.co.kr/learn/courses/30/lessons/92345 코딩테스트 연습 - 사라지는 발판 [[1, 1, 1], [1, 1, 1], [1, 1, 1]] [1, 0] [1, 2] 5 [[1, 1, 1], [1, 0, 1], [1, 1, 1]] [1, 0] [1, 2] 4 programmers.co.kr 풀이 다음 2가지의 경우에 승패가 결정됨 상하좌우 4방향 중 어떠한 방향으로도 이동 불가인 경우 하나의 발판에 2명이 위치할 때, 한명이 다른 발판으로 이동하여 현재 발판이 사라질 때 지는 플레이어든 이기는 플레이어든 각자 최적의 플레이로 진행 이기는 플레이어 - 최대한 빨리 승리하는 방향으로 진행 -> 움직이는 횟수를 최소화 지는 플레이어 - 최대한 오래 버티는.. 2022. 2. 3.
BOJ 1202 - 보석 도둑(Java) https://www.acmicpc.net/problem/1202 1202번: 보석 도둑 첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci www.acmicpc.net 풀이 완전 탐색으로 풀 경우 보석의 개수 N(1 ~ 300,000), 가방의 개수 M(0 ~ 100,000,000)으로 O(N*M)의 시간 복잡도를 가짐, 안될 거라 생각하고 풀어봤지만 역시나 시간초과 발생 * 시간 복잡도를 줄여야하며 우선순위 큐를 이용하여 품 우선 순위 큐를 이용한 풀이 - 가방에 대해서는 for문을 이용하여 탐색 -.. 2021. 12. 31.
BOJ 1715 - 카드 정렬하기(Java) https://www.acmicpc.net/problem/1715 1715번: 카드 정렬하기 정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장 www.acmicpc.net 풀이 이전의 합이 누적되는 형태 - (a + b) + (a + b + c) + (a + b + c + d) + ...... - 각 합의 작은 값이 누적되는 횟수를 크게, 큰 값이 누적되는 횟수를 작게 해야함 불가능한 방법 입력 요소의 정렬 만으로는 해결 불가능 - ex) 60, 50, 70, 80 - 요소 정렬 : 50, 60, 70, 80 - 누적 합 -> (50 + 60) + (.. 2021. 12. 27.
BOJ 11000 - 강의실 배정(Java) https://www.acmicpc.net/problem/11000 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si 현재 탐색 요소의 강의 시작시간 -> 같은 강의실로 할당 불가능, 새로운 강의실 필요 import java.io.*; import java.util.*; public class Main { static.. 2021. 12. 7.
BOJ 1946 - 신입 사원(C++) https://www.acmicpc.net/problem/1946 1946번: 신입 사원 첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성 www.acmicpc.net 서류와 면접 두 가지가 다른 지원자에 비해 떨어진다면 탈락 단순히 두 가지 조건에 대해 완전 탐색을 이용하기에는 시간초과가 발생, 최대한 탐색의 횟수를 줄이기 위해 고민했음 풀이 탐색하는 횟수를 줄이기 위해 우선 한가지 항목(서류 등수)에 대해 오름차순 정렬하여 탐색 다음 지원자(i+1)의 면접등수가 현재(i)의 지원자의 면접 등수보다 크다면 (i+1)순번의 지원자는 (i)지.. 2021. 8. 27.
BOJ 1756 - 피자굽기(C++) https://www.acmicpc.net/problem/1756 1756번: 피자 굽기 첫째 줄에 오븐의 깊이 D와 피자 반죽의 개수 N이 공백을 사이에 두고 주어진다. (1 ≤ D, N ≤ 300,000) 둘째 줄에는 오븐의 최상단부터 시작하여 깊이에 따른 오븐의 지름이 차례대로 주어진다. 셋 www.acmicpc.net 피자마다 오븐의 모든 지름을 탐색하는 완전 탐색의 경우 O(N*M)으로 300000의 데이터들을 탐색하면 시간 초과가 발생 이를 해결하기 위해 그리디 알고리즘을 적용하였으며, 풀이 후 검색해보니 이분탐색으로도 해결할 수 있다하여 이분탐색으로도 풀이 해봄 풀이 오븐의 너비는 이전 위치보다 현재 위치의 너비가 크다고해도 이전위치의 너비보다 큰 피자가 들어올 수 없다 더보기 ex) {3,.. 2021. 8. 26.