본문 바로가기

알고리즘

(179)
[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 방식을 ..
[2019 카카오 개발자 겨울 인턴십] 호텔 방 배정(Union-Find, Java, 자세한 설명, 접근법) ## 접근 1. 처음에는 Set 자료구조를 이용해서 문제를 해결하려고 했다. 방번호들을 자료구조에 저장하여, 해당 방번호의 존재 유무를 확인하고 없으면 바로 정답에 넣어주고, 아니면 해당 방번호 + 1부터 가능한 방을 탐색해야 한다. 2. 해당 방번호 + 1에서 시작하여 빈 방을 찾을 때, 순차적으로 접근한다면 k가 10^12이기 때문에 시간복잡도 문제가 발생한다. 3. Set 대신에 Map을 이용해서, 방번호를 Key로서 기억함과 동시에, Value로 다음 방번호를 찾게 하는 역할을 하게 만들고 싶다. 1, 3, 4, 1, 1을 생각해보면, 1 : Map에 미존재, M[1] = 2 3 : Map에 미존재, M[3] = 4 4 : Map에 미존재, M[4] = 5 1 : Map에 존재하므로, M[1]의 ..
[2019 카카오 개발자 겨울 인턴십] 불량 사용자 ## 접근 1. 불량 사용자와 대응하는 응모자 아이디의 모든 조합을 살펴봐야 한다. 완전 탐색이 필요하다. 2. 만들어 질 수 있는 모든 조합을 탐색을 할 때, 같은 응모자 아이디로 이루어진 조합은 제외해야 하므로, 비트마스크를 통해서 코드를 구성한다. * 비트마스크로 만들어진 결과를 Set 자료구조에 저장하면서 중복을 제거한다. ## 해설코드 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 38 39 40 41 42 43 44 45 46 47 48 49 50 import java.util.*; import java.io.*; import java.lang.*; class..
[2019 카카오 개발자 겨울 인턴십] 튜플(Java, 깊은 복사, 문자열 처리) ## 접근 1. 주어진 문자열을 {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}의 형태로 변환해야 한다. 이 집합들을 담고 있는 자료구조는 집합의 길이를 기준으로 정렬되어야 한다. * an을 구하기 위해서는, a1 ~ an-1을 알고 있어야 한다. 그래서, 집합의 길이를 기준으로 정렬하면서 a1부터 순차적으로 찾는다. 2. 정렬된 자료구조를 이용해, an을 구한다. {an, an - 1, a1, a2, ...} 식으로 순서가 섞여있더라도, 이미 an-1까지 알고 있으므로 an를 선택할 수 있다 an-1까지를 Set 자료구조를 이용해서 저장한다. ## 유의사항 1. 주어진 문자열들을 집합으로 변환하고, 자료구조에..
[2019 KAKAO BLIND RECRUITMENT] 블록 게임(Java, 간단한 코드) ## 접근. 1. 블록을 이루고 있는 4개 정사각형의 위치를 가지고 있는 자료구조를 만든다. 2. 블록들중에서, 없어질 수 있는 블록들 후보에 대해서 인덱스 자료구조를 만든다. * |__, __|, ㅗ, _|, |_ 이렇게 총 5가지이다. 3. 후보들이 검은 블록으로 지워지는지 확인하기 위해서는, 상대적으로 위에 위치한 블록들중에 지울 수 있는 건 모두 지워야 확인이 가능하다. 즉, 지워지는지 체크하기 위해서 후보들을 정렬할 필요가 있다. 가장 나중에 입력된 1 X 1 정사각형을 기준으로 내림차순 정렬을 한다. * 가장 나중에 입력된 1 X 1 정사각형이 모든 블록에서 행(ROW)이 가장 작다. 가장 낮은 위치의 1 X 1 정사각형을 사용해야, 지워질 수 있는 블록들을 모두 사라진 상태에서 속이 꽉 채워..