본문 바로가기

알고리즘/백준

(109)
[2019 카카오 개발자 겨울 인턴십] 징검다리 건너기(Java, 간단한 코드, Union-Find) programmers.co.kr/learn/courses/30/lessons/64062# 코딩테스트 연습 - 징검다리 건너기 [2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3 programmers.co.kr ## 접근 시뮬레이션 형태로 접근하면 절대 안된다. 시간복잡도가 대략적으로 계산해봐도 너무 크다. 따라서, 삭제해야할 돌을 우선순위큐에 넣어놓고, 순차적으로 접근한다. 돌이 가지고 있는 값이 지나갈 수 있는 사람의 수라고 볼 수 있다. 값이 3인 돌을 지우다가, 간격이 k보다 같거나 크면 문제가 발생하고 종료해야 한다. 순차적으로 돌들을 지우면서, 간격을 확인하는 방법을 생각해봐야 한다. 특정한 돌을 지울 때, 앞 뒤로 비어있는 돌들을 확인해서 값을 확인하면 된다. 앞 뒤로 비어있는 돌을..
[BOJ 3780] 네트워크 연결(Java, Union-Find) www.acmicpc.net/problem/3780 3780번: 네트워크 연결 입력은 여러 개의 테스트케이스로 주어진다. 입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스에는 기업의 수를 나타내는 N(4 ≤ N ≤ 20,000)이 주어진다. 다음은 몇 �� www.acmicpc.net ## 접근 이 문제는 대놓고 Union-Find 문제이다. Union-Find의 재귀호출 방식을 이용해서, 코드를 응용할 수 있는지 묻고 있다. 병합 과정의 2.를 이해가 쉽지 않았다. A 클러스트의 새로운 센터가 j가 된다는 것을 의미하는 내용인데, 처음 읽을 때는, B 클러스터의 별도의 센터가 존재할 수도 있다고 생각했다. Union시에 I의 새로운 센터를 J로 만들어 주고, I의 거리를 갱..
[BOJ 10775] 공항(Union-Find, Java) ## 접근 비행기를 최대한 많이 게이트에 도킹시키기 위한 방법은 입력으로 gi가 들어왔을 때, gi번째 게이트에서 1번 게이트까지 순차적으로 체크하면서 자리가 비면 넣어주면 된다. * 역순으로 검사하는 이유는, 앞으로 등장할 수 있는 현재 gi보다 값이 작은 어떤 gi들에 대해서 게이트를 최대한 보장하기 위해서이다. gi번째에 비행기가 이미 도킹되어 있을 때, 역순으로 1번까지 검사하는 것은 시간복잡도가 초과한다(MAX : 10^5 * 10^5). 따라서, gi가 이미 도킹되어 있을 때, 넣을 수 있는 게이트를 바로 확인할 수 있도록 하는 방법을 찾아야 한다. 비행기를 도킹할 때, 다음 게이트를 가르킬 수 있도록 Union 연산을 사용하고, Find 연산을 통해서 경로압축최적화를 통해 O(1)만에 비행기..
[BOJ 9938] 방 청소(Java, Union-Find, 문제 이해하기) https://www.acmicpc.net/problem/9938 9938번: 방 청소 처음 6개의 술은 규칙 1에 의해서 1, 3, 5, 7, 9, 2번 서랍에 보관할 수 있다. 7번째 술은 규칙 3을 적용할 수 있다. 1번 서랍에 들어있는 술을 2로, 2번 서랍에 들어있는 술을 3으로, 3번 서랍에 들어있�� www.acmicpc.net ## 접근 서랍에 대한 boolean 배열을 통해서, 서랍의 비어있는 유무를 파악하도록 한다. 서랍이 가득찼을 때, 규칙3과 규칙4에 말하는 다른 서랍의 의미를 파악하는 것이 중요하다. 다른 서랍의 핵심은 기존의 들어있는 술을 옮길 수 있는 서랍이여야 한다. 다른 서랍들에 대한 저장할 수 있는 자료구조가 필요하다. 서랍에 기존의 술이 있을 때, 기존의 술을 옮기기 위..
[BOJ 4195] 친구 네트워크(Java, Union-Find, 간단한 코드) ## 접근 친구 네트워크가 이룬다는 것은, 몇몇의 친구들이 같은 집단에 속한다는 것을 의미한다. 집단에 관한 처리를 가장 빠르게 할 수 있는 것은, Union-Find이다. 친구들이 입력될 때마다, Union 연산을 통해서 합쳐주고, 인원수를 별도의 자료구조에 저장해서 갱신하도록 한다. ## 유의사항 처음에 메모리 초과가 발생했었는데, 이유는 Find 연산 시에, 재귀적으로 계속 호출되서 스택 오버플로우가 발생했다. 항상, 재귀연산을 작성할 때는 무한 반복이 될 수 있는 가능성을 확인하고 코드를 작성해야 한다. ## 해설코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37..
[BOJ 1717] 여행 가자(Union-Find, Java, 자세한 설명) ## 접근 여행 경로가 가능한지 알아보기 위해서는, 두 점 사이에 경로가 존재하는지 확인해야 한다. 점들을 경유해서 두 점 사이의 경로가 만들어질 수도 있으므로, 가능한 모든 경로를 찾아봐야 한다. 위의 생각은, 점의 갯수가 작을 때는 시간복잡도가 작지만, 점의 개수가 많아지면 시간복잡도로 시간초과가 발생할 수 있다. 따라서, 점들을 경유해서 두 점 사이의 경로가 만들어지면, 두 점의 경로 유무를 저장해줄 수 있는 자료구조가 필요하다. 그렇다면, 두 점 사이의 경로가 있는지 확인하는 방법을 정해야 한다. 만약에, N이 200일 때, 모든 점 사이의 경로를 본다면, 최대 200 ^ 200의 시간 복잡도가 발생한다. 무조건 시간초과이다. 연결이 되는 점들을 모두 같은 집합에 넣는 Union-Find 방식을 ..
[BOJ 14226] 이모티콘(Java, 간단한 코드, 런타임에러, 증명) https://www.acmicpc.net/problem/14226 14226번: 이모티콘 영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만�� www.acmicpc.net 이 문제를 Bottom-up으로 접근할 수 없다. 화면에 있는 이모티콘 중 하나를 삭제하기 때문에, 순차적인 접근이 이루어지기 어렵다. 1. Top-Down 방식으로 DP를 작성한다. DP의 매개변수는, 화면에 이모티콘 수와 클립보드 이모티콘 수로 2개를 사용한다. 2. BFS를 이용해서, 3가지 기능에 대해서 구현해주면 된다. 또한, 메모이제이션 기법을 통해서 중복을 제거해 시간복잡도를 줄이도..
[BOJ 12865] 평범한 배낭(Java, DP) https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 1. 전체 물품을 이용해서, 제시된 K 무게까지의 최대 가치를 구해야 한다. 소문제로 나누어서 문제를 풀기 위해서, 두 가지 변수를 사용한다. 물품과 무게를 사용해서 DP를 구성한다. 2. DP의 점화식을 세워야 하는데, DP[i][j] = max(DP[i - 1][j] + DP[i - 1][j - i번째 물품 무게] + i번째 가..