본문 바로가기

알고리즘145

백준 10816 숫자 카드 2 (HashMap과 BinarySearch를 이용한 풀이) 백준 10816 숫자 카드 2 (JAVA 자바 풀이) 📌 문제 숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오. ⚔ 입력 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있.. 2023. 7. 4.
백준 2470 두 용액 (JAVA 자바 풀이: 이분 탐색 활용) 백준 2470 두 용액 (JAVA 자바 풀이) 처음 풀이한 방식은 다음과 같다. 1) 숫자 배열을 정렬한 후 -> O(nlogn) 2) 모든 숫자를 돌면서 -> O(n) 3) 해당하는 숫자의 역부호(마이너스면 플러스, 플러스면 마이너스)를 취한 값을 바이너리 서치로 찾되 -> O(logn) 4) 정확히 일치하는 숫자가 없으면 근사값을 리턴하여 5) 최소값을 갱신하면서 가장 0과 가까운 쌍을 찾는다 -> O(1) 시간 복잡도에서는 문제가 없었지만 로직이 잘못되어 다음과 같은 반례를 만날 경우 잘못된 답을 리턴했다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.ut.. 2023. 7. 4.
백준 2295 세 수의 합 (JAVA 자바 풀이) 백준 2295 세 수의 합 (JAVA 자바 풀이) 문제의 요구사항을 그대로 구현하여 모든 경우의 수를 탐색하는 방식은 다음과 같을 것이다. for (int i =0; i 시간 복잡도 O(n^2 * nlogn) 💡 코드 구현 import java.io.. 2023. 7. 4.
백준 14425 문자열 집합 (이분 탐색을 이용한 JAVA 자바 풀이) 백준 14425 문자열 집합 (이분 탐색을 이용한 JAVA 자바 풀이) https://www.acmicpc.net/problem/14425 이분 탐색을 이용한 풀이이다. N개의 문자열로 이루어진 집합 S에서 M개의 문자열 중 집합 S에 속하는 문자열의 개수를 구해야 한다. 자바의 컬렉션 Set의 contains 메서드를 이용하면 간단하게 풀 수 있지만 바이너리 서치를 직접 구현해 풀어보기 좋은 문제여서 바이너리 서치를 이용해 풀어보았다. 먼저 문자열을 sort 해준다. String[] strings = new String[N]; while(N-->0){ strings[N] = bufferedReader.readLine(); } Arrays.sort(strings); -> 시간 복잡도 O(nlogn) 문자.. 2023. 7. 3.
이분탐색 (binary search), 아이디어, 작동 원리, 시간 복잡도/성능, 특징, 자바 구현 코드 이분 탐색 혹은 이진 탐색 정렬되어 있는 집합에서 원하는 값을 찾는 효과적인 탐색 방법으로 알려진 이분 탐색에 대해 알아본다. 아이디어 큰 틀은 분할 정복 원리를 이용한다. -> 배열의 가운데 원소 A[mid]와 탐색키 x를 비교한다. -> 이 때 3가지 케이스로 나뉜다. (1)탐색키=가운데원소 → 탐색성공(인덱스mid반환후종료) (2)탐색키가운데원소 → 순환호출 (이진 탐색(원래 크기 1/2의 오른쪽 부분배열)) *mid = ( 시작인덱스 i + 마지막 인덱스 i )/ 2 - 분할 과정: 배열의 가운데 원소를 기준으로 왼쪽과 오른쪽 부분배열로 분할. 탐색키와 가운데 원소가 같으면 가운데 원소의 배열 인덱스를 반환/종료 - 정복 과정: 탐색키가 가운데 원소보다 작으면 왼쪽 부분배열을 대상으로 이진 탐색을.. 2023. 7. 3.