본문 바로가기

전체 글

(201)
[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..
[JAVA] 알고리즘에서 자주 쓰이는 자료구조 정리(예제, 사용시기, 백준, 프로그래머스, 필수 자료구조) ## Stack - 순차적으로 데이터를 접근하면서, 이전 데이터와 신규 데이터가 같을 때 연산이 이루어지는 문제에서 사용 - 중복 허용한다. * 예제 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 import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { Stack stk = new Stack(); if(stk.empty()){ stk.push(1); stk.push(2); stk.push(3); } if(!stk.empty()){ i..
[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 정사각형을 사용해야, 지워질 수 있는 블록들을 모두 사라진 상태에서 속이 꽉 채워..
[2019 KAKAO BLIND RECRUITMENT] 길 찾기 게임(Java, 간단한 코드) ## 접근 1. 주어진 노드의 x, y 좌표를 자료구조에 넣고 정렬한다. y는 내림차순으로, x는 오름차순으로 정렬한다. 정렬의 이유는 트리에 삽입하기 위해서다. 2. 루트 노드에서부터 시작하여, 노드를 넣기 위한 위치를 탐색한다. 노드의 x좌표를 기준으로, 작으면 왼쪽, 크면 오른쪽으로 탐색하다가, null을 만나면 삽입한다. 3. 전위순회와, 후위순회 코드를 작성할 때, 출력 부분을 이용해서 정답을 만든다. ## 해설코드(Java). 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 51 52 53 5..
[2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브(Java) ## 접근 1. HashMap을 이용해서, 인덱스와 음식을 먹는데 소요되는 시간을 추가한다. 음식을 먹는데 소요되는 시간이 낮은 것부터 정렬한다. 2. 정렬된 키를 이용해서, 순차적으로 접근하며 k를 차감시킨다. k를 차감시킬 때, 식을 정확하게 세워야 한다. 또한, 다음 계산을 위해서 HashMap의 값들을 일일이 차감시키는 방식이 아니다. 계산이 이루어질때, 이전 가장 작은 값을 이용해서 k를 차감시킨다. * k = k - (남아있는 개수) * (현재 가장 작은 값 - 이전 가장 작은 값) 3. 만약, 차감 후에 값이 음수가 나온다면, 현재 존재하는 키들의 개수를 이용해서 순서를 찾으면 된다. ## 유의사항 1. Long의 형태이므로, 중간 과정에서 int로 값이 변환되지 않도록 주의해서 작성한다.(..
[2020 KAKAO BLIND RECRUITMENT] 기둥과 보 설치(Java, 간단한코드) ## 접근 1. 문제에서 준 조건 두 가지를 이용한다. 기둥은 바닥 위에 있거나 보의 한쪽 끝 부분 위에 있거나, 또는 다른 기둥 위에 있어야 합니다. 보는 한쪽 끝 부분이 기둥 위에 있거나, 또는 양쪽 끝 부분이 다른 보와 동시에 연결되어 있어야 합니다. 2. 문제에서 제거 및 추가에 대해서, 특정한 맵에 반영하고 위의 조건 두 가지를 만족하는지 확인한다. ## 시행착오 1. 맵을 2차원 배열이 아닌, 기둥과 보를 각각 마크할 수 있는 3차원 배열을 해야한다. 왜냐면, 같은 위치에(x, y) 보와 배열이 설치될 수 있다. 2. if문과 else문 사용 시, 주의해야 한다. continue, break 사용 시에 주의해야 한다. 이것때문에 계속 틀렸었다. ## 해설코드 1 2 3 4 5 6 7 8 9 1..