Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/16564 요약하자면, 게임 캐릭터 개수 N과 올릴 수 있는 레벨 총합 K가 주어집니다. N명의 캐릭터에게 레벨 K를 골고루 올릴 때, 가능한 팀의 목표 레벨(팀에서 제일 낮은 캐릭터의 레벨)중 최대 값을 출력해야 합니다. 1) 예제 입출력❄️ 3명의 캐릭터가 각각 레벨이 10, 20, 15인 경우 입니다. 올릴 수 있는 레벨은 10입니다. 골고루 분배했을 때, 최소 레벨의 최댓값을 구해야 합니다. 첫 번째 캐릭터에게 +7, 세 번째 캐릭터에게 +3 하면 레벨은 각각 17, 20, 18이 되어 최소 레벨이 17이 되며, 이게 최소 레벨의 최댓값입니다. 2. 핵심 논리☢️ 찾고자 하는 팀의 목표 레벨(trg_lev..
Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/1300 요약 하자면, 첫줄에 배열의 크기 N이 주어지고 다음줄에 k가 주어집니다. 그러면 NxN 배열 A를 1차원 배열로 만들고 오름차순으로 정렬한 배열을 B라고 할 때, B[k]를 출력해야 합니다. 이 때, NxN 배열 A는 A[i][j] = ixj로 원소들이 있습니다. 예를들어 1행 1열은 1, 1행 2열은 2 이렇게 값이 들어있습니다. 1) 예제 입출력❄️ 2. 핵심 논리☢️ NxN행렬을 1열로 펴지 않고, 각 행에서 trg_value(타겟 값)이하인 수의 개수가 곧 타겟 값의 인덱스임을 이용해서 이분탐색을 하는것이 핵심입니다. 이 때, estimated_idx를 이분 탐색하여 trg_value를 찾기 때..
Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/2143 요약하자면, 두 개의 배열 A와 B가 있다. A의 부배열과 B의 부배열의 합이 T가 되는 부배열 쌍의 개수를 구하는 문제입니다. 부배열 이란? 배열 A가 1~n까지 원소가 있을 때, (1
Contents 1. 배경 주피터 노트북을 실행하다 보면, 셀에서 마지막 실행한 코드는 반환해주는데, 여러 값들을 보려면 위에 print()를 찍어줘야 하는 경우가 있습니다. 만약 여러 데이터 프레임의 shape와 어떻게 생겼는지 간단히 출력해보려면, print문에 display 문까지 아래처럼 적어줘야 합니다. 특히 데이터를 EDA하거나, 다양하게 살펴보는 경우 여간 번거로운 일이 아닙니다. 이를 간단히 해결하는 방법을 알아보겠습니다. 2. 해결 방법 1) InteractiveShell 사용 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" # Cell의 모든 반..
Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/11000 첫째 줄에 수업의 개수 N이 주어집니다. 다음으로 N줄에 걸쳐, 각 수업의 시작시간 Si와 끝시간 Ti가 공백을 구분자로 주어집니다. 모든 수업을 가능하게 하는 최소한의 강의실 개수를 출력해야합니다. 1) 예제 입출력❄️ 강의 1 3과 3 5는 끝시간과 시작시간이 같으니 한 교실에서 할 수 있지만, 2 4는 겹치기 때문에 다른 교실에서 해야합니다. 즉, 최소로 교실 2개가 필요하므로, 2를 출력합니다. 2. 핵심 논리☢️ [시작 시간, 끝 시간] 을 원소로 갖는 이중리스트에 대해 오름차순으로 정렬하고, 최소 힙에 끝시간을 저장하고, 시작시간이 끝시간과 겹치는 경우만 heap에 새로 추가하고, 겹치지 않..
Contents 1. 문제🔥 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42747 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 주어집니다. 발표한 논문 n편 중, h번 이상 인용된 논문이 h 편 이상이고, 나머지 논문이 h번 이하 인용되었다는 조건을 만족하는 h의 최댓값을 반환해야 합니다. 1) 예제 입출력❄️ 2. 핵심 논리☢️ citations를 정렬하고, 이분 탐색을 이용해 0부터 citations의 길이만큼 h로 반복하며, 인용횟수가 h 이상인 논문의 개수를 bisect(이분 탐색)을 이용해서 구하는 것이 핵심입니다. (bisect_left는 아래 글에서 개념을 설명하고 있습니다.) 2022.03.26 - [..
Contents 1. 문제🔥 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42746 요약하자면, 숫자 배열이 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 리턴해야 합니다. 1) 예제 입출력❄️ 첫 번째 예시를 보면, [6, 10, 2]에 대해 [6102, 6210, 1062, 1026, 2610, 2106]와 같은 조합을 만들 수 있고 가장 큰 수는 6210입니다. 이를 문자열 "6210"으로 리턴해야 합니다. 2. 핵심 논리☢️ 숫자는 큰수가큰 수가 앞에 나와야 합니다. 하지만 3과 31중에 31보다 3이 앞에 나와야 더 큰 수가 됩니다. 313보다 331이 더 크기 때문입니다. 즉, 3과 31을 비교할 때는 33..
Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/1202 요약하자면, 첫줄에 N(보석 개수)와 K(가방 개수)가 주어지고, 다음에 N줄에 걸쳐 보석의 무게(Mi)와 보석의 가겨(Vi)가 주어지며, 다음에 K줄에 걸쳐 각 가방의 허용 무게(Ci)가 주어집니다. 상덕이가 K개의 가방에 대해 각각 허용 무게를 지키며 보석을 훔칠 때, 최대 가격을 구하는 문제입니다. (각 가방엔 보석이 1개만 들어가고, 보석의 무게와 가격은 0이상, 가방의 허용 무게는 1이상 입니다.) 1) 예제 입출력❄️ 첫번째 예제를 보면, 보석은 2개, 가방은 1개. 각 보석의 (무게, 가격)은 (5, 10), (100, 100)이고, 가방 1개의 허용 무게는 11입니다. 가방이 1개이기 때문..
Contents 1. 문제🔥 링크: https://school.programmers.co.kr/learn/courses/30/lessons/43162 문제를 요약하자면, 컴퓨터 개수(n)과 각 컴퓨터의 연결 정보(computers)를 줬을 때, 연결 성분의 개수를 출력하는 문제입니다. 1) 예제 입출력❄️ 첫번째 예제를 보겠습니다. n=3으로 컴퓨터는 3대이고, computers는 아래와 같은 형태입니다. [[1,1,0], [1,1,0], [0,0,1]] 이 2차원 배열의 의미는 i행 j열에 1이면 i번 컴퓨터와 j번 컴퓨터는 연결된 것입니다. 즉, 대각 성분은 자기 자신이기 때문에 항상 1이고 그 외에, 1행 2열과 2행 1열이 1로 채워져 있습니다. 즉 1번 컴퓨터와 2번 컴퓨터가 연결된 것입니다. ..
Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/1461 요약하자면, 일직선 좌표가 있고, 0 위치에 어질러진 책들을 각각 원래 자리에 가져다 둬야 하는데 최소한으로 움직여야 하고, 최소한의 거리를 출력하는 문제입니다. 주의할 점은 책의 위치는 0이 아니라는 것과 마지막 책을 가져다 두고는 0으로 다시 돌아올 필요가 없다는 점입니다. 1) 예제 입출력❄️ 첫 번째 예제를 보면, 7권을 갔다 놔야 하고, 한 번에 들 수 있는 책은 최대 2권입니다. 다음 줄에 7권에 대해 원래 자리의 좌표가 공백을 구분자로 입력됩니다. 2. 핵심 논리☢️ 핵심은 양수와 음수를 나눠서 리스트에 저장하고, M권씩 묶어서 가져다 두는데, 먼 위치부터 가져다 둬야 한다는 점과 전체 책 ..
Contents 1. 문제🔥 링크: https://www.acmicpc.net/problem/14719 2차원 세계의 높이 H와 W가 주어지고, 그 다음 줄에는 각 열에 블록이 몇개씩 쌓여있는지가 주어집니다. 위 블록 이미지는 아래 예제 입력 2의 이미지 입니다. 고일 수 있는 빗물의 양을 출력하는 문제 입니다. 1) 예제 입출력❄️ 2. 핵심 논리☢️ 핵심은 각 블록에 대해서, 왼쪽과 오른쪽을 탐색해 두 방향 모두에서 더 높은 블록에 둘러 쌓여있으면 빗물이 고이는 것을 이용하는 것입니다. 자기를 둘러싼 왼쪽과 오른쪽 블록 중 더 낮을 블록까지 빗물이 고이는 것을 이용합니다. 3. 풀이 코드✅ H,W=[*map(int,input().split())] blocks=[*map(int,input().split..
Contents 1. 문제🔥 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42885 쉽게 말하면, 구명보트의 제한 무게에 맞춰 최대한 2명씩 태워서 구명보트의 개수를 최소화해서 출력하는 문제입니다. 1) 예제 입출력❄️ people = [70, 50, 80, 50]이고, limit = 100 일 때, 몸무게가 70, 80인 사람은 혼자 태워 보내고, 50인 사람 2명을 태워 보내면 필요한 구명보트의 최소 개수는 3개입니다. 2. 핵심 논리☢️ 주어진 people 리스트를 정렬하고, 리스트의 첫 번째 인덱스(0)와 마지막 인덱스(len(people)-1)에 포인터를 설정해서 그 합이 limit 초과일 때와 limit 이하일 때 구명보트에 2..