전체 글 179

카펫 (lv2)

문제 설명 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한 사항 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다. 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다. 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다..

단어 변환 (lv3)

문제 설명 두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다. 2. words에 있는 단어로만 변환할 수 있습니다. 예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다. 두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로..

구명 보트 (lv2)

문제 설명 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다. 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요..

큰 수 만들기 (lv2)

문제 설명 어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다. 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다. 문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요. 제한 조건 number는 2자리 이상, 1,000,000자리 이하인 숫자입니다. k는 1 이상 number의 자릿수 미만인 자연수입니다. 상당히 재밌는 문제다. 가장 먼저, 처음에 떠올렸던 아이디어를 구..

볼링공 고르기 - 그리디

A가 어떤 공을 고르면, B는 반드시 A가 고른 공과는 다른 무게를 가진 공을 골라야 한다. 그리고 이 문제에서 중요한 것은 두 사람중 어떤 사람이 공을 집었는지는 사실 상관 없다는 것이다. 다시말해 A가 1번 공을 집고 B가 2번 공을 집는 경우와 A가 2번 공을 집고 B가 1번 공을 집는 경우는 완전히 같은 경우라는 말이다. 따라서 단순히 조합문제로 다음과 같이 풀 수 있다. from itertools import combinations from collections import Counter n,m = map(int, input().split()) data = list(map(int, input().split())) result = 0 for c in combinations(Counter(data)..

무지의 먹방 라이브 (lv4)

무지의 먹방 라이브 * 효율성 테스트에 부분 점수가 있는 문제입니다. 평소 식욕이 왕성한 무지는 자신의 재능을 뽐내고 싶어 졌고 고민 끝에 카카오 TV 라이브로 방송을 하기로 마음먹었다. 그냥 먹방을 하면 다른 방송과 차별성이 없기 때문에 무지는 아래와 같이 독특한 방식을 생각해냈다. 회전판에 먹어야 할 N 개의 음식이 있다. 각 음식에는 1부터 N 까지 번호가 붙어있으며, 각 음식을 섭취하는데 일정 시간이 소요된다. 무지는 다음과 같은 방법으로 음식을 섭취한다. 무지는 1번 음식부터 먹기 시작하며, 회전판은 번호가 증가하는 순서대로 음식을 무지 앞으로 가져다 놓는다. 마지막 번호의 음식을 섭취한 후에는 회전판에 의해 다시 1번 음식이 무지 앞으로 온다. 무지는 음식 하나를 1초 동안 섭취한 후 남은 음..

만들 수 없는 금액 - 그리디

지니고 있는 동전들로 만들 수 없는 target 값을 찾아야 하는데, 바꿔말하면 지니고 있는 동전들로 target-1까지의 모든 금액을 만드는 방법을 찾아야 한다. 따라서 금액이 최소인 동전부터 하나씩 조합해보면서 만들 수 있는 target-1값을 갱신하겠다는 아이디어가 핵심이 되겠다. 위 예시와 같이 현재 동전이 1,1,2,3,9원이 있다고 하자. 1원 하나로 만들 수 있는 금액은 다음과 같을 것이다. 1 = 1 1원까지는 1원 하나로 전부 만들 수 있으니, 또 1원을 추가하여 [1,1]원으로 만들 수 있는 금액은 다음과 같을 것이다. 1 = 1 1 + 1 = 2 2원 까지는 [1,1]원으로 전부 만들어 볼 수 있으니, 2원을 추가하면 경우의 수는 다음과 같을 것이다. 1 = 1 2 = 2 1 + 2 ..

모험가 길드 - 그리디

각 그룹을 최소한의 인원으로 짜면 최대의 그룹 수를 얻을 수 있다는 아이디어가 핵심이다. 조건에서 공포도가 X인 모험가는 반드시 X명 이상으로 구성된 그룹에 들어가야 하고, 이러한 그룹을 최대한 많이 만들기 위해서는 공포도가 X인 사람은 딱 X명으로 구성된 그룹으로 묶어주는것이 좋겠다. 예시로 주어진 2, 3, 1, 2, 2 의 경우, 1 단 한명으로 구성된 그룹, 2 두명으로 이루어진 그룹으로 짜서 총 두개의 그룹을 만드는게 정답이 되는데, 모든 모험가가 그룹을 맺을 필요가 없으며 공포도가 큰 모험가 일수록 많은 인원을 필요로 하며, 결과적으로 비용이크므로 선호도가 떨어진다는 이야기가 된다는 사실에 기반하여 정답으로 판단 가능하다. 위 가정을 구현하기 위해 주어진 배열을 오름차순으로 정렬한 뒤 공포도에..

주식가격 (lv2)

문제 설명 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한 사항 prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다. 참 멀리 돌아서 온 문제이다. 주식의 특정 시점의 가격이 얼만큼 오래동안 그 가격보다 떨어지지 않는지 알아내는 것이 핵심임을 기억하고 다음 차트를 살펴보자. 위 차트는 예시로 나온 주식 가격 추이를 나타낸 것이다. 시간이 지날 때 마다 그 이전에 기록된 가격들 중 현재 가격보다 낮은 가격들은 카운트를 그만해야 하는데, 이 아이디어 까지는 떠올리는데 성공했으나 그것을 구현하는데 있어 쓸데없는..

0/1 Knapsack Problem - Dynamic Programming

얼만큼의 비용과 보상이 정해진 여러개의 물체가 있다고 하자. 특정 용량까지 수용 가능한 마대에 이 물체들을 마대의 최대 수용량을 넘기지 않게 넣어주되, 담겨있는 물체들의 보상의 합이 가능한 경우의 수 중 최대가 되게 하려고 한다. 이 때의 경우를 구하는 것이 본 문제의 핵심이다. 예를 들면 보석의 수 n이 4로 주어지고, 각각 다음과 같은 조건을 만족한다. profit = {1, 2, 5, 6} weight = {2, 3, 4, 5} 보석을 담을 마대의 수용량 m은 8로 주어졌을 때 어떤 보석을 챙겨야 가장 많은 보상을 챙길 수 있을까? 단순히 생각하면 각 보석을 담는 모든 경우의 수 중 한계 수용량을 넘는것을 제외하고 가장 보상의 값이 큰 조합을 찾으면 될 것이다. 하지만 이 경우 2^4 만큼의 연산을..