본문 바로가기

반응형

Computer/Coding Test

(33)
코딩테스트 문제 (25) - 텀 프로젝트 문제 1. p = [3,1,3,7,3,4,6], N = 7 => 3 2. p = [1,2,3,4,5,6,7,8], N = 8 => 0 풀이 입력을 통해 그래프를 구성하고 사이클에 속하지 않은 정점들의 개수를 출력하는 문제입니다. DFS를 통해 노드를 재귀적으로 방문하면서 리스트를 채워주고 이미 방문한 정점에 도달했을 때, 그 시작점부터의 리스트를 반환하면 사이클에 속한 정점을 구할 수 있습니다. 이를 전체 노드 수에서 빼주면 답을 구할 수 있습니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도: 중 DFS를 이용한 그래프 사이클 판별 참조 claude-u.tistory.com/435 www.acmicpc.net/problem/9466
코딩테스트 문제 (24) - 순열 사이클 문제 1. p = [3,2,7,8,1,4,5,6] => 3 2. p = [2,1,3,4,5,6,7,9,10,8] => 7 풀이 입력으로 들어온 순열로 그래프를 구성하고 그래프 내의 사이클의 개수를 출력하는 문제입니다. DFS를 통해 문제를 해결할 수 있습니다. 매 노드에 대해 DFS 함수를 호출하고 방문 노드를 기록합니다. 사이클이라면 DFS가 종료되고 방문하지 않은 다음 노드에 대해 DFS를 호출합니다. 호출한 DFS 횟수마다 카운트 하면 전체 사이클 개수를 얻을 수 있습니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도: 중 DFS, 사이클 판별 참조 www.acmicpc.net/problem/10451
코딩테스트 문제 (23) - 방향 그래프에서 사이클 찾기 방향 그래프에서 사이클이란 특정 정점에서 시작해 어떠한 경로를 지나 다시 그 정점으로 돌아오는 경로를 말합니다. 무방향 그래프에서는 서로소 집합으로 사이클을 판별할 수 있습니다. 반면, 방향 그래프에서는 어떻게 사이클이 있는지 판별할까요? DFS는 깊이우선탐색입니다. DFS를 이용해 그래프를 탐색하게 되면 해당 시작 정점에서 갈 수 있는 모든 정점을 방문한 뒤 종료됩니다. 이를 이용해 시작점과 방문점으로 이루어진 DFS 함수를 구성하여 시작점과 방문점이 같은 경우 사이클이 존재한다고 판단할 수 있습니다. 다음 그래프는 4,6,7 노드 간 사이클이 존재합니다. 이 그래프에 대해 사이클이 존재하는지에 대한 코드는 다음과 같습니다. 시간 복잡도 일단 DFS를 수행하는 것은 모든 정점을 방문하고 모든 간선을 방..
코딩테스트 문제 (22) - 랜선 자르기 문제 1. Ks = [802, 743, 457, 539], N = 11 => 200 풀이 K개의 랜선의 길이가 주어졌을 때, N개의 랜선을 만들 수 있는 가장 큰 랜선 자르는 길이를 구하는 문제입니다. 간단히 생각해보면 랜선을 자르기 위한 최대 길이는 배열 중 가장 긴 랜선이고 최소 길이는 1입니다. 즉, 1과 가장 긴 랜선 사이에 N을 만족하는 최대값을 구하면 되는 문제입니다. 이렇게 넓은 범위에서 특정 값을 찾는 문제는 이진 탐색 방법으로 풀 수 있습니다. Left, right를 양 끝으로 정하고 가운데를 탐색해서 그 가운데 값으로 랜선을 잘랐을 때 N보다 작으면 더 작은 값이 필요하니 right를 가운데로 옮기고 반대의 경우는 left를 가운데로 옮깁니다. Left를 가운데로 옮길 때 최대값을 계속..
코딩테스트 문제 (21) - 가장 긴 팰린드롬 부분문자열 문제 가장 긴 팰린드롬 부분문자열 (substring)을 출력하는 문제입니다. 1. 'babad' => 'aba' or 'bab' 2. 'cbbd' => 'bb' 풀이 생각해보면 가장 작은 팰린드롬은 2글자 아니면 3글자가 될 수 있습니다. 그렇다면 2칸, 3칸으로 이루어진 슬라이딩 윈도우를 구성하고 이를 왼쪽에서부터 이동시키면서 팰린드롬이면 양쪽의 칸을 한 칸씩 확장하여 팰린드롬인지 확인합니다. 확장한 후 팰린드롬을 확인할 때, 전체를 볼 필요 없이 양 끝값이 같으면 팰린드롬이라고 간단히 판단할 수 있습니다. 이런 방식으로 확장시키면서 팰린드롬일 경우 계속 저장해서 길이가 긴 문자열을 추출하면 되는 문제입니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도..
코딩테스트 문제 (20) - 유효한 팰린드롬 팰린드롬은 앞뒤가 똑같은 단어나 문장을 말합니다. 뒤집어도 같은 말이 되는 것이죠. 문제 주어진 문자열이 팰린드롬인지 확인하는 문제입니다. 대소문자를 구분하지 않고 영문자와 숫자만을 대상으로 합니다. 1. "A man, a plan, a canal: Panama" => True 2. "race a car" => False 풀이 영문자와 숫자만을 대상으로 하므로 string의 isalnum()을 이용하거나 정규표현식의 re 라이브러리를 이용해도 됩니다. 앞뒤가 똑같으므로 영문자와 숫자만의 string으로 만든 이후에 앞에서 1개, 뒤에서 1개씩 뽑아내면서 같으면 계속 진행하고 다르다면 False를 return하면 됩니다. kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리..
코딩테스트 문제 (19) - 무지의 먹방 라이브 카카오 2019 블라인드 코딩테스트 기출문제입니다. 문제 1. food_times = [3,1,2], k = 5 => 1 2. food_times = [8,6,4], k = 15 => 2 풀이 효율성 테스트까지 통과해야 합니다. 일반적인 for 문을 지속적으로 돌면서 시뮬레이션 할 경우 정확성 테스트는 통과할 수 있으나 효율성 테스트는 통과할 수 없을 겁니다. 1번 케이스를 한 번 생각해보죠. 5초가 되기 전까지 1->2->3->1->3의 순으로 음식을 먹어 남아있는 음식은 1이 될겁니다. 이렇게 생각을 해보면 어떨까요? 우선 먹는 시간이 적은 음식부터 오름차순으로 (시간, 음식 index) 형태로 나열해봅시다. 그렇다면 [(1,2), (2,3), (3,1)] 이 될겁니다. 음식의 개수가 3개이기 때문에..
코딩테스트 문제 (18) - 후보키 카카오 2019 블라인드 코딩테스트 문제입니다. 데이터베이스의 후보키의 수를 추출하는 문제입니다. 문제 1. relations = [["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"], ["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] => 2 ([0], [1,2]) 풀이 먼저 유일성을 확인하기 위해 칼럼의 모든 부분 집합을 생성해야 합니다. 부분 집합을 만드는 것은 dfs로 구현할 수 있고 만든 부분 집합이 유일성을 만족하는 지 확인합니다. 그 후, 유일성을 만족하는 부분 집합에 대해 최소성 검증을 하..

반응형