알고리즘 문제풀이/백준 158

#2805 : 나무 자르기

풀이방법 사용된 것: 이분 탐색 2022.06.15 랜선 자르기 문제와 동일한 방식으로 풀면 된다. #1654 : 랜선 자르기 풀이방법 사용된 것: 이분 탐색 2022.06.14 1 이상, 갖고 있는 가장 긴 랜선의 길이 이하 중에 정답이 존재한다. 이 범위 내를 이분탐색하면 된다. 범위를 1부터 갖고 있는 가장 긴 랜선보다 1 큰 값까 blowupmomo.tistory.com 특정 높이로 기계를 설정하고 나무를 잘랐을 때 얻을 수 있는 목재의 길이가 M 미만인지 아닌지를 판별하여 이분 탐색을 한다. 코드 Java(2022.06.15) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; im..

#1654 : 랜선 자르기

풀이방법 사용된 것: 이분 탐색 2022.06.14 1 이상, 갖고 있는 가장 긴 랜선의 길이 이하 중에 정답이 존재한다. 이 정도 범위는 이분 탐색으로 풀었을 때 합리적인 시간 내에 해결된다. 그래서 이분 탐색으로 푸는데, 이때 upper_bound의 방식으로 풀었다. upper_bound에 대한 설명은 아래 게시글에 있다. 초급 7회차 이분탐색 & 분할정복 이분탐색과 분할정복 모두 문제를 쪼개어 해결하는 방식임. 쪼갠다는 것은 무엇인가 문제의 크기가 크면 어렵다. 문제를 작은 부분 문제들로 나누어 풀면 쉬워진다. 문제를 쪼개고, 부분 문제들 blowupmomo.tistory.com upper_bound를 이용하는 이유는 다음과 같다. 이 문제의 상황을 살펴보았을 때, 정답 값 이하의 길이로 랜선을 자..

#1822 : 차집합

풀이방법 사용된 것: TreeSet 2022.06.12 TreeSet을 사용한다. A의 모든 요소들을 TreeSet에 넣는다. add()를 사용한다. B의 모든 요소들에 대하여, TreeSet에 포함된 요소라면 TreeSet에서 해당 요소를 지운다. contains()와 remove()를 사용한다. 첫째 줄에 TreeSet의 크기를 출력한다. size()를 사용한다. 둘째 줄에 TreeSet의 모든 요소를 처음부터 출력한다. for(int i: (트리셋 이름)) 을 사용해도 되고, while(!(트리셋 이름).isEmpty()) 반복문 안에서 pollFirst()로 출력해도 된다. 코드 Java(2022.06.13) import java.io.BufferedReader; import java.io.IOE..

#1246 : 온라인 판매

풀이방법 사용된 것: 정렬 2022.06.12 각 가격에 대하여, 그 가격에 팔 수 있는 달걀의 개수는 (그 가격 이상을 지불할 의사가 있는 사람의 수) 와 (경래가 가지고 있는 달걀의 총 개수) 중 작은 쪽이다. M명의 사람이 제시한 값 M개에 대하여 각각 위의 방법으로 팔 수 있는 개수를 구한다. 그 결과값이 가장 클 때를 찾고, 결과값이 가장 클 때의 가격이 여러 가지라면 그 중 가장 싼 쪽을 정답으로 택한다. 코드 Java(2022.06.12) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTo..

#10825 : 국영수

풀이방법 사용된 것: 정렬 2022.06.12 조건에 맞게 학생 클래스를 정의하고 Comparator를 오버라이드해주면 된다. Comparator를 오버라이드하는 방법은 아래의 게시글에 정리해두었다. 자바에서 내 마음대로 정렬하기: Comparator Overriding 기본 데이터타입이 아닌 객체(Object)를 정렬해야 할 때가 있다. 또한, 자바에서 기본으로 제공해주는 정렬함수로는 수행하기 힘든 복잡한 방식/기준의 정렬이 필요할 때도 있다. 백준 #1931 회의실 blowupmomo.tistory.com 코드 Java(2022.06.12) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReade..

#2217 : 로프

풀이방법 사용된 것: 정렬 2022.06.12 주어진 밧줄들이 견딜 수 있는 하중을 오름차순 정렬한다. 정렬된 리스트의 앞쪽부터(견딜 수 있는 하중이 적은 것부터) 모든 밧줄들에 대하여 (i번째 밧줄이 견딜 수 있는 하중) × (전체 밧줄의 개수 - i) 를 구한다. 이렇게 구한 결과값들 중 가장 큰 것이 정답이다. 코드 Java(2022.06.12) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static void main(String[] args) throws IOException{ // ..

#2309 : 일곱 난쟁이

풀이방법 사용된 것: 정렬 브루트포스 알고리즘 2022.06.12 주어지는 난쟁이가 9명밖에 안 되므로 브루트포스로 쉽게 풀 수 있는 문제이다. 9명 중 7명을 골라내는 문제이므로, 제외할 2명만 알아내면 된다. 9명 중 2명을 고르는 경우의 수는 72가지이다. 72가지를 모두 해보고, 키의 합이 100이 되는 경우가 발견되면 즉시 화면에 정답을 출력한다. 코드 Java(2022.06.12) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static void main(String[] args) ..

#1302 : 베스트셀러

풀이방법 사용된 것: 정렬 HashMap TreeSet 2022.06.12 먼저 HashMap hm 을 이용해 각 책들의 판매권수를 센다. 입력으로 들어오는 책 제목들을 순서대로 하나씩 읽으면서, 처음으로 입력된 책 제목이라면 hm에 (책 제목, 1) 을 추가한다. 이전에 입력된 적 있는 책 제목이라면 hm에 (책 제목, hm.get(책 제목)+1) 을 추가한다. 이렇게 하면 마지막에는 각 책 제목에 대하여 (책 제목, 팔린 권수)가 저장되어있게 된다. 그 다음엔 TreeSet answer를 이용하여 정답을 구한다. int형 변수 max를 선언하고 1보다 작은 수로 초기화한다. hm의 KeySet의 각 요소 str에 대하여, hm.get(str)이 max와 같을 경우, answer에 str을 넣는다. h..

#1059 : 좋은 구간

풀이방법 사용된 것: 정렬 수학 2022.06.12 먼저, 좋은 구간에 들어갈 수 있는 수들의 범위를 찾는다. 편의를 위해 이 범위에 속하는 수들의 집합을 T라고 하겠다. T의 모습은 N의 값에 따라 다음의 셋 중 한 가지로 결정된다. 첫째, N이 집합 S의 수들 중 하나와 값이 같을 경우, T에 들어갈 수 있는 수는 없다. 이 경우에는 정답이 0이므로 화면에 0을 출력하고 끝내면 된다. 둘째, N이 집합 S의 수들 중 가장 작은 수보다 작을 경우, T에 들어갈 수 있는 수들의 범위는 1부터 (S의 가장 작은 수) - 1 까지 이다. 예를 들어 집합에 6, 9, 12가 있고 N이 2라면 T = {1, 2, 3, 4, 5}이다. 셋째, N이 집합 S의 어떠한 두 수 사이에 낀 수일 경우, T에 들어갈 수 ..

#3187 : 양치기 꿍

풀이방법 사용된 것: 깊이우선탐색 2022.06.09 3184번 문제와 완전히 똑같은 문제이다. 양이 'o'가 아닌 'k'로 표시된다는 것만 다르다. #3184 : 양 풀이방법 사용된 것: 깊이우선탐색(DFS) 2022.05.25 그래프 탐색을 통해 각 영역에 속한 칸들을 탐색하고 양과 늑대의 마릿수를 세는 문제이다. 나는 깊이우선탐색을 사용하였다. 알고리즘은 다음과 blowupmomo.tistory.com 코드 Java(2022.06.09) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { s..