본문 바로가기

반응형

TIL/코테 스터디

(31)
99클럽 코테 스터디 23일차 TIL: 완전탐색 + 백트래킹 문제https://www.acmicpc.net/problem/15686풀이치킨집을 최대 M개를 골랐을 때, 도시의 치킨 거리의 최솟값을 출력하는 문제치킨집을 고르는 것은 조합을 구하는 것을 의미한다.조합을 구하는 코드는 다음과 같이 짰다.func dfs(i: Int, selected: [(Int, Int)]) { if selected.count == m { result = min(result, getDistance(coord: selected)) return } for index in i..동일한 치킨집을 뽑으면 안되기 때문에 뽑은 치킨집 다음 치킨집 부터 탐색할 수 있도록 index 값을 파라미터로 받았다.치킨집을 뽑았으면, 특정집에서 가장 가까운 치킨집을 고르..
99클럽 코테 스터디 22일차 TIL: 브루트포스 문제https://school.programmers.co.kr/learn/courses/30/lessons/87946풀이n이 최대 8이므로, 브루트포스로 풀 수 있는 문제이다.모든 순열을 구해 가장 많은 던전을 돌 수 있는 횟수를 구하면 된다.시간복잡도는 $O(n!)$ 으로 예상된다.예를들어 던전의 개수가 3이라면123, 132, 213, 231, 312, 321 총 6개 = 3! 이 도출된다.이는 첫번째 뽑을 수 있는 던전 수 (3), 두번째 뽑을 수 있는 던전의 수는 자기 자신을 제외한 (2) 개 .. 순으로 되기 때문이다.모든 순열을 구하는 것과 동일하다.재귀를 통하여 구해주었다.던전을 선택할 때 현재 피로도가 최소 피로도 보다 많아야 하고, 방문하지 않은 던전이여야 한다.여기서 백트래킹 기법을 사..
99클럽 코테 스터디 21일차 TIL: 힙 응용 문제https://www.acmicpc.net/problem/19638풀이힙을 사용하여 풀 수 있는 문제이다.최대값을 계속해서 뽑아내야 하므로 최대힙을 사용하는 것이 시간복잡도 측에서 유리한 방법이다.최대힙으로 pop 연산을 하여 입력받은 h보다 작다면 YES 및 횟수 아니라면 NO 및 최대값을 출력해주면 된다.한가지 고려해야할 점으로는 1/2 연산을 하기도 전에 모든 거인의 키가 입력받은 h보다 작을 때를 고려해주어야한다.소스코드후기고려해야할 점을 몰랐다면 맞외틀이 나올만한 문제였다..
99클럽 코테 스터디 20일차 TIL: 빠른입출력 문제https://www.acmicpc.net/problem/2075풀이Swift는 입출력이 느려 Fread 방식으로 구현된 빠른 입력을 사용해야 한다.빠른 입력만 사용해서 정렬해서 N번째 큰수를 구하는 방법도 있겠지만, Heap을 사용해서 풀이하는 방법이 있다.일반적으로 정렬은 $NlogN$의 시간복잡도를 띄는데, 힙의 pop연산은 $logN$이므로 우선순위 큐를 사용하는 편이 일반적으로 더 빠를 것이라고 생각했다.힙은 전날 풀이한 코드에 올려두어서 생략하고 동일한 코드를 사용하여 풀었다.소스코드후기빠른입력을 사용하면 쉽게 풀 수 있는 문제.백준에서 입력값이 크면 Swift 시간을 좀 늘려주면 좋겠다..
99클럽 코테 스터디 19일차 TIL: 힙 문제https://www.acmicpc.net/problem/1927풀이힙을 구현하면 되는 문제이다.파이썬이나, c++ stl에는 힙이나 우선순위큐가 있는 것으로 알고있는데, Swift에는 없어서 직접 구현해주어야 한다.음.. 기억상으로 파이썬에서 최대힙? 만 지원해서 음수를 곱해서 넣거나 이런 스킬들을 사용했었던 것으로 기억이 어렴풋난다..Swift로 힙을 구현하는 것은 해봤어서, 해당 코드로 문제를 풀이하였다.힙 구현한 것은 이전에 포스팅 해두었었다.https://dev-mandos.tistory.com/244 [자료구조] Heap에 대해 알아보고 구현해보기 (Swift)Heap이란? Heap은 트리를 사용하고, 트리 중 에서도 완전이진트리를 기본으로 한 자료구조입니다. 주로 최솟값과 최댓값을 빠르게..
99클럽 코테 스터디 18일차 TIL: 그리디, 정렬 문제https://www.acmicpc.net/problem/2212풀이일단 문제를 이해하는 것에 시간이 좀 들었다.집중국를 어디에 두어야 최솟값을 구해야할 지 머릿속으로 생각해보고 있었다.이 문제에서는 기존에 주어진 입력을 정렬해도 상관없겠다 생각해서 정렬해서 생각해보았다.[1, 3, 6, 6, 7, 9]2에하나, 7에하나 두는게 정답인데 멍청하게 6이 두개일 때 6에서 7을 수신하는데 드는 거리를 2라고 생각했다;; (두개여서..)이 부분에서 시간을 많이 잡아먹었다.결국 구간을 나눠야 되는 것이라고 생각했고 구간은 차이가 가장 큰 부분을 나눠주면 된다고 생각했다.1번 예제에서는 구간을 두개로 나눠야 하므로, 차이가 가장 큰 부분을 빼주면 두 구간으로 나누게 된다.[2, 3, 0, 1, 2] 라면 3,..
99클럽 코테 스터디 17일차 TIL: 수학 문제https://www.acmicpc.net/problem/31926풀이규칙을 찾으면 쉽게 풀 수 있는 문제이다.n = 1 일 때 문장은 다음과 같다.daldidalgodaldidan => 10하나씩 뜯어보자.[d][a][l][d][i][dal][g][o][daldia][n] => 10n = 2일 때는 다음과 같다.[d][a][l][d][i][dal][g][o](9) + [daldidalgodaldida][n] => 11n = 3 일 때도 11이다. 2의 제곱 만큼 중복된 것을 선언할 수 있다.n = 4일 때 부터 12, 8부터 13, 16부터 14 .. 이는 수식으로 표현했을 때 $log_2(N)$ 을 내림처리하여 10을 더해주는 것으로 도출할 수 있다. 소스코드후기달디달고달디달고.. 규칙을 찾는데 ..
99클럽 코테 스터디 16일차 TIL: 그리디 문제https://www.acmicpc.net/problem/2847풀이현재 레벨에 얻을 수 있는 점수가 다음 레벨에서 얻을 수 있는 점수 보다 크다면,현재 레벨에서 얻을 수 있는 점수를 낮춰주면 된다.점수를 내리는 것을 최소한으로 해야하기 때문에, 다음 레벨에서 얻을 수 있는 점수보다 1 낮게 셋팅해주면 된다.항상 답이 존재하는 경우만 있으므로, 음수가 되는 것은 일단 생각하지 않고 풀이하였다.그런데 이 문제는 앞에서부터 확인하는 것이 아닌 뒤에서 부터 확인해야 한다.왜 그럴까?예시 입력의 5, 5, 5를 확인해보자첫번째 레벨의 점수가 5점이고, 두번째 레벨의 점수가 5점이다.그러면 첫번째 레벨의 점수를 1 낮춰 4로 변경해주자.그러면 다음과 같다. 4, 5, 5두번째 레벨의 점수와 세번째 레벨의 점수..

반응형