본문 바로가기

알고리즘/프로그래머스

(20)
[프로그래머스] 단어 변환(Level 3, JAVA, 왜 BFS를 사용해야 하나?, BFS/DFS, 깊이 탐색, 너비 탐색) programmers.co.kr/learn/courses/30/lessons/43163 코딩테스트 연습 - 단어 변환 두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수 programmers.co.kr ## 문제접근 시작 단어에서 출발하여서 타겟 단어로 만들어야 한다. 그 과정은 최소가 되어야 한다. 최소가 되기 위해선, 최적의 단어 순서를 찾는 것뿐만 아니라, 중복해서 단어를 방문해서는 절대 안된다. 단어의 중복 방문은 무한 루프에 빠지게 할 수 있다. 최적의 단어 순서를 찾기 위해서 완전 탐색을 이용하고 중복된 단어를 방문하지 ..
[2020 카카오 인턴십] 보석 쇼핑 programmers.co.kr/learn/courses/30/lessons/67258 코딩테스트 연습 - 보석 쇼핑 ["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7] programmers.co.kr ## 접근 직관적으로 생각해야 답이 있다. 처음에는, 모든 범위에서 양쪽 범위를 줄여가며 탐색하려고 했다. 하지만 이 경우에는, N * N의 시간복잡도를 가졌다. 정확성 테스트는 통과했지만, 효율성 테스트는 통과하지 못했다. 따라서, N * logN이나 N의 시간복잡도를 가지도록 코드를 설계해야 했다. 보석의 개수를 중복을 제거할 수 있는 자료 구조를 통해서 구한다. 순차적으로, 보석들을 읽어가면서, 보석의 개수가 완성이 됐..
[2020 카카오 인턴십] 수식 최대화(Java, 문자열 처리, ArrayList For문 내 원소 삭제) programmers.co.kr/learn/courses/30/lessons/67257 코딩테스트 연습 - 수식 최대화 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 � programmers.co.kr ## 접근 처음에 시행착오를 겪었던 것은, 문자열 내에서 모든 걸 조작하려고 했다. replace를 사용해서 코드를 작성해보니 '-'가 붙어있는 것이 연산용도인지 음수를 나타내는지 확인이 불가능해지고 코드가 더러워진다. 주변 코드를 참고해, 피연산자와 연산자를 구분해 자료구조에 넣기로 했다. 여기서, 배열을 사용하지 말고, ArrayList를 사용해야 한다. ArrayL..
[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 정사각형을 사용해야, 지워질 수 있는 블록들을 모두 사라진 상태에서 속이 꽉 채워..
[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..