본문 바로가기

전체보기

(180)
백준[16906] 욱제어 (Python3) dfs만 써도 풀 수 있지만, 연습을 위해 트라이를 사용했다 예제 볼 때는 단어 길이가 오름차순인줄 알았지만, 제출하고 보니 무작위였다. 트라이 풀이 매 탐색마다 0 또는 1을 붙이는 2가지 분기로 나뉜다. 만약, 현재 만들어진 단어가 다른 단어의 접두사인 경우(트라이에 끝이 명시돼 있음) 탐색을 중단하고 다른 단어를 알아봐야 한다. 이렇게 생긴 문자열이 만들려는 단어 길이와 일치하면 해당 단어를 트라이에 추가해준다. 더보기 import sys sys.setrecursionlimit(10 ** 5) class Trie: def __init__(self): self.root = {} self.answer= [] def insert(self, word): current_node = self.root for ..
백준[19942] 다이어트 (Python3) 문제 자체는 쉬웠지만, 최적의 경로를 사전 순으로 빠른 것을 출력하란 것 때문에 생각이 좀 필요했던 문제. 하지만, 그렇게 어렵게 생각할 필요는 없는 문제였다. 최적의 답을 찾기 위해, 재료를 순서대로 탐색하며 먹을지, 안 먹을지 결정하면 된다. 즉, 매 순간 2가지 선택지가 있으므로, 2^15만큼의 시간 복잡도가 필요하다. 따라서 백트래킹을 사용해 문제를 풀이했다. 사전 순으로 빠르게 출력하란 것은 내가 첫번째 인덱스부터 탐색을 했다면, 신경쓸 필요가 없다. 왜냐하면, 백트래킹 탐색 순서가 낮은 인덱스부터 차례대로 올라가기 때문이다. 탐색한 경로를 리스트 형태로 관리하면서, 기존보다 적은 비용으로 목표 영양소를 섭취할 수 있다면 기존 값을 교체한다. 백트래킹을 쓰지 않는 경우, 파이썬이라면 i tert..
백준 [15971] 두 로봇 (Python3) 처음부터 꼬아서 생각했다가 복잡하게 푼 문제 경로를 계산하는 방법은 3가지가 있다. A가 한 칸 뒤로 가고, B가 한 칸 앞으로 감. B가 한 칸 뒤로 가고, A가 한 칸 앞으로 감. A, B가 그냥 현재 위치에서 통신 위 3가지 경우를 고려하면 A부터 출발하든, B부터 출발하든 특정 간선 하나는 지나지 않는다. 이 간선은 바로 A부터 B 또는 B부터 A까지 가는 간선 중 가장 비용이 큰 간선이다. 이렇게 구한 총 비용 중, 가장 큰 비용을 빼면 답이 나온다. 나는 위 3가지 경우를 다 고려해서 A부터 B까지 모든 경로 구한뒤에 B부터 탐색을 시작해, 매 지점마다 저 3가지를 고려했다. 그래도 N의 범위가 작기 때문에 통과는 됐지만 좋은 해결책은 아니었다. from collections import de..
백준[17671] 로봇 (Python3) 다3 치고 생각보다 풀만했던 문제. 관찰을 하면서 탐색 범위를 조금씩 좁혀나간다면 충분히 해결할 수 있다. 랑이집사님이 알려주신 완전 탐색부터 시작하는 최적화를 잘 써먹은 문제 완전 탐색 로봇의 움직임을 3가지를 나눠 계산한다. 1. 왼쪽으로 한 칸 갈 때 2. 가만히 있을 때 3. 오른쪽으로 한 칸 갈 때 이 방법으로 문제를 해결할 경우 O(3^N)으로 시간 초과가 난다. 이를 줄이기 위해, 로봇이 움직이는 거리를 높이거나, 일부 로봇은 움직이지 않는 식으로 탐색 범위를 좁혀나가야 한다 생각했다. 완전탐색 최적화 1 처음부터 로봇을 최소한만 겹칠 수 있게 이동 겹치게 된다면 안 겹치도록 입력된 위치에서 + 를 해준다. 하지만, 이 방법은 로봇들이 서로 가까이에 있다면, 불필요하게 많이 이동하는 경우가 ..
2022 KAUPC 2회 출제 후기 9월 17일에 제 2회 한국항공대학교 프로그래밍 경진대회 KAUPC가 개최됐다. 출제진으로 참가한 계기 문제를 풀면서 출제자의 의도가 무엇인지 생각하다 보니, 나라면 이 알고리즘을 사용해 어떤 문제를 만들 수 있을까에 대해서 생각하게 됐다. 이런 생각이 계속되다 보니 문제 출제에 관심이 생겼고, 마침 1회 KAUPC 출제진 참여 제안을 받아 출제진으로 참가하게 됐다. 하지만, 처음이라서 그런지 좋은 문제를 만들지 못했다. 그래서 다음 대회에도 출제진으로 나가는 것에 대해 고민을 하던 중 2회 KAUPC 출제진 제안을 받게 됐다. 그동안 구상한 문제들도 있었고 작년에 비해서 더 좋은 문제들을 만들 수 있다 생각해 수락을 했고 이렇게 2회 KAUPC 출제진으로 참가하게 됐다. 문제 제작 3문제를 구상했지만,..
백준 [1052] 물병 (Python3) 문제 링크 : https://www.acmicpc.net/problem/1052 1052번: 물병 지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번 www.acmicpc.net 2의 제곱을 이용해 풀 수 있는 문제. 처음에 식을 만들어 문제를 풀었더니 WA를 받았다. 틀린 이유를 찾는 과정에서 1 ~ 10 개의 물병을 최대로 합칠 수 있는 경우에 대해 써본 결과 복잡하게 공식을 쓸 것도 없이 완전탐색을 통해 해결할 수 있단 것을 알았다. N 합치는 과정 1 1 -> 1개 2 1, 1 -> 2 -> 1개 3 1, 1, 1 -> 2, 1 -> 2개 4 1, 1, 1..
백준 [1059] 좋은 구간 (Python3) 문제 링크 : https://www.acmicpc.net/problem/1059 1059번: 좋은 구간 [9, 10], [9, 11], [9, 12], [10, 11], [10, 12] www.acmicpc.net 2번 틀리고 해결한 문제, 이 문제에서 함정이 있는데, 예제만 보고 배열을 구성할 경우 20%에서 틀릴 것이다. 완전 탐색 입력 받은 집합 S를 오름차순 정렬해, N보다 처음으로 값이 큰 위치와 그 전 위치의 값을 각각 A, B라고 하자. 지문 범위에 맞추기 위해 A는 1 더하고, B는 1 뺀다. 만약, 정확히 일치하는 S의 원소가 있다면 0을 출력하고 프로그램을 종료한다. 최소 값이 A 부터 N - 1까지는 지정할 수 있는 최대 범위가 N ~ B이고, 최소 값이 N이면 지정할 수 있는 최대 ..
백준 [10164] 격자상의 경로 (Python3) 문제 링크 : https://www.acmicpc.net/problem/10164 10164번: 격자상의 경로 입력의 첫째 줄에는 격자의 행의 수와 열의 수를 나타내는 두 정수 N과 M(1 ≤ N, M ≤ 15), 그리고 ○로 표시된 칸의 번호를 나타내는 정수 K(K=0 또는 1 < K < N×M)가 차례로 주어지며, 각 값은 공백으 www.acmicpc.net 완전 탐색 BFS를 통해 격자까지 가는 경우의 수 * 격자에서 N * M 번 수가 있는 곳까지 가는 경우의 수를 곱한다. N크기가 작았기 때문에 AC를 받을 거라 생각했지만, 부분점수만 맞았다. 이유를 생각해보니 경우의 수를 세야 하기 때문에 이전에 갔던 곳을 또 갈 수 있다. 즉, 방문 처리를 하지 못하기 때문에 N, M이 커질 수록 탐색 횟수..