본문 바로가기

Algorithm/Practice

(81)
이코테 - 공유기 설치 with JAVA 해결 이 문제를 해결하기 위해서는 공유기 설치 간격을 이분탐색으로 구하면 된다. 즉, 공유기 설치 간격을 정해서 입력받은 공유기의 수보다 공유기를 설치 못한다면 공유기 설치 간격을 줄이고 반대로, 입력받은 공유기 수와 같거나 더 많이 설치 가능하다면 공유기 설치 간격을 늘려가며 이분탐색을 진행한다. 예를 들어, 집은 1, 2, 4, 8, 9 에 위치하고 공유기는 3개를 설치하고 싶다고 가정하자. 집간 최소 간격은 1이고 최대 간격은 8이다. 따라서 start=1, end=8로 설정한다. 첫번째 mid= 4가 되고 이는 공유기 설치 간격은 4가 되는 것이다. 위 집들에 적용하면 1, 8에 설치 가능하다. 이는 공유기 3개보다 적으므로 설치 간격을 줄인다. 두번째로는 start=1, mid=2, end=3 ..
이코테 - 정렬된 배열에서 특정 수의 개수 구하기 풀이 1. 기본적으로는 이진탐색이 배경이 된다. (찾고자 하는 값보다 현재 값이 작다면 start = mid+1, 반대는 end = mid-1) 2. 첫번째 인덱스 찾기 - 현재 인덱스가 0이거나 현재인덱스 -1 에 해당하는 값이 찾고자하는 값보다 작고 현재 인덱스에 해당하는 값이 찾고자하는 값일 때, 종료 - 현재 인덱스의 값이 찾고자하는 값보다 작다면 start = mid+1 - 현재 인덱스의 값이 찾고자하는 값보다 크거나 같다면 end = mid-1 예를들어, 1 2 2 2 2 2 3 이 있고 mid는 3이다. 찾고자하는 것은 2의 시작점이다. 인덱스 3에 해당하는 값은 2이다. 해당 인덱스는 0도 아니고 해당 인덱스의 전값이 2보다 작지도 않으므로 첫번째 조건은 성립하지 않는다. 해당 값은 2보다..
이코테 - 안테나 with JAVA 이 문제에서 가장 중요한 점은 값을 기준으로 정렬 후 중간값에 해당하는 인덱스에 값이 정답이 된다는 점이다. 증명은 여러가지 경우의 수를 체크해볼 경우 파악이 가능하다. 코드 import java.util.*; public class Q2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); List values = new ArrayList(); for(int i=0; i
이코테 - 특정 거리의 도시 찾기 with JAVA 1. 입력받을 때는 아래와 같이 nextInt() 써서 입력받자 2. List queue = new ArrayList(); 보다 Queue queue = new LinkedList();가 효율적이다. -> 전자는 삭제시 모든 데이터를 앞으로 땡기기위해 옮겨야 하지만 후자는 그렇지 않기 때문이다. 3. 단방향이기에 방문처리가 필요없다. import java.util.*; public class Q1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int k = sc.nextInt(); int x = sc.nextInt(); List m..
Programmers - 무지의 먹방 라이브 with JAVA 로직 우선, 큐에 [음식 양, 음식 번호] 를 넣고 음식양이 오름차순이 되도록 정렬한다. 예를 들어, [1, 2], [2, 3], [3, 1]이 있다고 가정하자. - 처음 꺼낸 리스트는 [1, 2]가 된다. - 음식양 1을 전체 리스트의 길이(3)만큼 먹는다. 하지만 1*3은 k보다 작으므로 더 진행 - 두번째 꺼낸 리스트는 [2, 3]이 된다. - 전에 1만큼 먹었기 때문에 2-1 = 1이 된다. - 음식양 1을 전체 리스트의 길이(2)만큼 먹는다. 그럼 지금까지 3 + 2를 먹었다. 이는 k와 같으므로 리스트를 다시 넣어주고 종료한다. (지금까지 먹은양이 k보다 크다는 의미는 이번 음식이 없어지면서 또는 없어지기 전에 k만큼 먹었다고 할 수 있다.) 종료 시점에 리스트의 번호만 보면 [1, 3]이 남..
이코테 - 만들 수 없는 금액 with JAVA 문제 N개의 동전으로 만들 수없는 양의 정수 중 최솟값을 구하라 로직 예를 들어, [1, 1, 2, 3, 9] 원이 있다고 가정하자. 1. 1원을 가지고는 1원까지 만들 수 있다. 2. 1원을 가지고는 2원까지 만들 수 있다. 3. 2원을 가지고는 4원까지 만들 수 있다. 4. 3원을 가지고는 7원까지 만들 수 있다. 5. 9원을 가지고는 16원까지 만들 수 있다. 증명 1원 - 1 2원 - 1, 1 3원 - 1, 2 4원 - 1, 1, 2 5원 - 3, 2 6원 - 3, 2, 1 즉, 결론적으로 a원을 가지고 있다면 기존에 만들 수 있는 금액 m원에 더해 a+m원까지 만들 수 있다. 코드 import java.util.*; public class Q4 { public static void main(St..
Programmers - 등산 코스 정하기 with JAVA 로직 1. 양방향 맵 생성 2. 산봉우리마다 확인 3. 우선순위 큐를 통해 가장 비용이 짧은순으로 처리 - 우선 순위 큐는 비용순으로 처리 - 방문 처리 - 봉우리마다 가장 가까운 출발지 방문시 바로 종료 (비용순으로 처리하고 출발지에 번호는 상관없기에 종료 가능) - 중간비용이 이미 정답보다 크다면 종료 (예를 들어, 산봉우리 A처리 후 최소값이 5라고 가정, 산봉우리 B 처리 중 이미 비용이 5 이상이라면 더이상 처리할 필요없어짐.) 4. 비용이 가장 작으면서 산봉우리 번호가 가장 작은 구역 반환 코드 import java.util.*; class Solution { public int[] solution(int n, int[][] paths, int[] gates, int[] summits) { i..
Programmers - 블록 이동하기 with JAVA 로직 이 문제는 너무 복잡했다. 따라서 차분히 설계 후 코드를 작성하는 것이 훨씬 도움이 많이 됨을 느꼈다. 기본적으로 우선순위 큐와 방문처리 배열을 활용해 로직을 처리한다. - 우선 순위 큐에은 비용, (x1, y1), (x2, y2), 방향을 담는다. - 방문처리는 가로, 세로 둘 다 (x2, y2)를 기준으로 방문처리를 한다. - 항상 가로는 왼쪽, 세로는 위쪽이 (x1, y1)이 되도록 고정 처리한다. - 방향마다 모든 이동 경로에 대한 로직을 작성한다. 코드 import java.util.*; class Solution { public int solution(int[][] board) { int n = board.length; int m = board[0].length; // 비용, x1, y1..