본문 바로가기

분류 전체보기111

P2110. 공유기 설치 문제 링크: https://www.acmicpc.net/problem/2110 설명 이 문제는 어떤 풀이를 써야할지 잡히지 않아 어려움이 있었다. 일단 가장 인접한 두 공유기 사이의 거리를 최대로 라는 말이 이해가 가지 않았다. 이 말은 즉, 공유기 사이의 거리가 최대한 떨어져있도록 설계하라는 말이다. 이분탐색으로 풀려면 어떻게 해야할까? 가장 인접한 두 공유기 사이의 거리를 이분 탐색으로 구하여, 해당 거리에서 설치해야하는 공유기 개수를 만족하는지 확인하는 것이다. 예시를 살펴보자. 예시는 공유기 사이의 거리가 차례로(정렬된 상태에서) 1, 2, 4, 8, 9이다. 이때 최소한의 거리는 1이고 최대는 8이므로 거리의 중앙값은 (1 + 8) // 2로 4가 mid가 된다. 그럼 이 값을 기준으로 현재 집.. 2023. 5. 4.
P2493. 탑 문제: https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 www.acmicpc.net 설명 하나의 리스트에 넣고 오른쪽부터 시작하여 비교하면서 빼는 방식으로 하면 시간초과가 발생한다. 처음에 리스트에 넣을 때부터 비교하면서 넣는 방법은 어떨까? 주어진 값은 6-9-5-7-4 이다. stack = [] : 최댓값을 저장할 스택, 이후에 들어오는 값들과 비교한다. result = [] : 결과값을 저장할 스택 일단 신호를 수신받으려면, 최댓값이 크거나 같아야 한다. 스택이 비.. 2023. 5. 4.
P2805. 나무 자르기 - 문제: https://www.acmicpc.net/problem/2805 설명 이 문제를 풀 때 계속 실수한 점은 M 미터의 나무를 잘랐다고 반복을 멈췄다는 것이다. 문제를 읽어보면 이때, **적어도 M미터**의 나무를 집에 가져가기 위해서 절단기에 설정할 수 있는 **높이의 최댓값**을 구하는 프로그램을 작성하시오. 적어도 M미터, 높이의 최댓값에서 최적값이 따로 있을 수 있기 때문이다. 여기서 최소한 M미터를 챙겨가는 절단기의 최대 높이 K를 구한다는 최적화 문제는 '결정 문제'로 바꾸어 풀 수 있다. 이것을 파라메트릭 서치라고 한다. 자세한 내용 참고: https://sarah950716.tistory.com/16 즉 우리는 나무의 높이 배열이 주어졌을 때, 절단기의 높이가 x인 경우 잘린 나무.. 2023. 5. 4.
P11053. 가장 긴 증가하는 부분 수열 문제: https://www.acmicpc.net/problem/11053 가장 긴 증가하는 부분 수열 문제, 줄여서 LIS(Logest Increasing Subsequence)라고도 한다. 크게 완전탐색, DP, 이진탐색 방식으로 풀이할 수 있다. 유사한 문제가 여럿 있는데 이 문제는 DP(Dynamic Programming)방식으로도 풀리는 문제이다. 이번에는 위 3가지 방식으로 모두 풀이하겠다. 일단 LIS란 무엇일까? LIS는 어떤 수열에서 특정 부분을 지워서 만들어낼 수 있는 증가 부분 수열 중 가장 긴 수열을 말한다. 꼭 부분수열의 원소들이 배열에 이어져있지 않아도 된다. 완전 탐색 증가 부분수열은 다음 특징을 갖는다. 정수 i,j에 대해 i < j이면, S[i] < S[j]이다.(0 인접한.. 2023. 5. 4.
[크래프톤 정글] 14일 - deque, Review 오늘 한 일☀️ - deque 공부 - 알고리즘 하 문제 위주 풀이 -> 완료 - 알고리즘 문제 오답 -> 진행 중 - 이진 탐색 공부(lower bound, upper bound, check 위주) -> 진행 중 deque deque는 앞, 뒤에서 데이터를 정리할 수 있는 양방향 자료형이다. +) 왜 양방향이 필요한가! 한쪽 방향으로만 출입구를 사용하면 맨 앞에 있는 원소를 제거할 때 n번의 이동이 필요하다. 평균적으로 n/2. 하지만 앞에서 뺀다면 1번만에 빠지기 때문에 상관없다. 자료구조 개념은 이전에 공부한 경험이 있으니, 각 언어에서 사용법을 알면 될 것 같다. 참고로 deque를 파이썬 공식 문서에서 찾아보면 양쪽 끝에서 빠르게 추가와 삭제를 할 수 있는 리스트류 컨테이너 라고 나온다. 여기서.. 2023. 5. 4.
[크래프톤 정글] 13일 - Stack 오늘 한 일🌴 - Stack 공부 - Algorithm 문제 풀이(2470, 11053, 1629, 10828, 10773, 9012, 17608, 2493) Stack 데이터를 임시 저장할 때 사용하는 자료구조이다. 데이터의 입력과 출력 순서는 후입선출(LIFO: Last In First Out) 방식이다. 고정 길이 Stack class FixedStack: """고정 길이 스택 클래스""" class Empty(Exception): """비어 있는 FixedStack에 팝 또는 피크할 때 내보낸다.""" pass class Full(Exception): """가득 찬 FixedStack에 푸시할 때 내보내는 예외 처리""" pass def __init__(self, capacity): """스택 초.. 2023. 5. 3.
[크래프톤 정글] 12일 - 탐색 오늘 한 일📝 - 이분 탐색 이론 공부 - Algorithm 문제 풀이(1920, 2805, 8983, 2630) 이분탐색 탐색은 데이터 집합에서 원하는 값을 가진 원소를 찾아내는 알고리즘을 말한다. 대표적인 탐색 방법은 다음과 같다. 배열 검색 연결 리스트 검색 이진 검색 트리 선형 검색(Linear search) 직선 모양(선형)으로 늘어선 배열에서 검색하여 원하는 키값을 가진 원소를 찾을 때까지 맨 앞부터 순서대로 검색하는 알고리즘을 말한다. n의 복잡도를 갖는다. 검색 종료 조건 검색 실패: 검색할 값을 찾지 못하고 배열의 맨 끝을 지나는 경우(if i == len(a)) 검색 성공: 검색할 값과 같은 원소를 찾는 경우(if a[i] == key) 배열 원소의 개수가 n일 때, 조건을 판단하는 횟.. 2023. 5. 3.
[크래프톤 정글] 11일 - 첫 시험 1주차 알고리즘 시험 더하기 사이클: https://www.acmicpc.net/problem/1110 1,2,3 더하기 - 재귀: https://www.acmicpc.net/problem/9095 부분수열의 합 - Brute force: https://www.acmicpc.net/problem/1182 더하기 사이클 문제 풀이 단계를 차분하게 정리하면 풀 수 있는 문제이다. 무조건 10의 자리로 만들어야한다고 생각해서 복잡하게 단계를 구상했는데 그렇지 않았다.(시험에서 뭔가 이상한 방향으로 가면 과감하게 나오는 것도 필요하다.😅) 이 문제에서 0을 앞에 넣어야한다는 생각에 str로 형변환하면서 풀이하려고 했는데 자릿수로 할 수 있는 문제였다. 이후에 두 방식대로 모두 풀이했다. 자릿수로 풀이한 경우 f.. 2023. 5. 3.
Greedy 문제 풀이 - 잃어버린 괄호, 신입사원, 멀티탭 스케쥴링 Greedy 문제는 특별한 방식이 있기보다는 그리디 문제임을 확인하고, 문제를 최적화할 수 있는 우선 순위를 찾는 것이 필요하다고 생각한다. 최적화이기 때문에 모든 문제에 범용적으로 적용되는 것은 아니고, 문제마다 최적화할 수 있는 방안을 빨리 캐치하는 것이 필요하다. 이때 직관을 요구한다고 생각한다. 문제를 풀이하기 위한 아이디어를 간략하게 정리해보겠다. 1541. 잃어버린 괄호 1541번: 잃어버린 괄호 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 www.acmicpc.net 적당히 괄호를 쳐서 식의 최솟값을 구하는 것이다. 예를들어, 55-50+40.. 2023. 5. 3.