목록Python (138)
나의 개발일지
문제 : https://school.programmers.co.kr/learn/courses/19344/lessons/242258 🔑 말 그대로 구현하기 1초 단위로 계산을 했다. 공격받는 시간이 되면 attacks리스트에서 빼내고 공격을 받는다. 연속 성공 횟수 초기화 죽으면 -1 리턴 공격받는 시간이 아니라면 회복을 한다. 초당 회복 최대 체력 이상 넘어가지 않게 컨트롤 연속 성공 횟수에 도달하면 추가 회복하고 횟수 초기화 죽지 않고 살아 있다면 남은 HP를 리턴하면 끝 ✨ def solution(bandage, health, attacks): success = 0 # 연속 성공 횟수 time = 1 hp = health while attacks: if time == attacks[0][0]: # 공..
문제 : https://www.acmicpc.net/problem/17503 🔑 이분 탐색 맥주 종류를 선호도 기준으로 내림차순 정렬 mid값 (간 레벨)을 기준으로 정해진 개수만큼 맥주를 마시고 선호도를 채울 수 있는지를 확인 만족한다면 mid값을 계속 낮춰보고 최솟값을 찾으면 끝 ✨ import sys input = sys.stdin.readline n, m, k = map(int, input().split()) bear = [list(map(int, input().split())) for _ in range(k)] bear.sort(reverse=True) l = 0 r = 2**31 while l = level: # 간 레벨 >= 도수 sum_p += p drink += 1 if drink == ..
문제 : https://www.acmicpc.net/problem/2212 🔑 그리디, 정렬 n = 6 (센서 개수) k = 2 (집중국 개수) 1 6 9 3 6 7 (센서 위치) 입력받은 센서들의 위치를 오름차순 정렬한다. [1, 3, 6, 6, 7, 9] 이 센서들의 간격을 구하고 오름차순 정렬한다. [0, 1, 2, 2, 3] 집중국이 2개니까 센서들의 위치를 2등분을 해야 한다. 이 나누는 기준을 간격이 가장 큰 위치로 한다. 결론적으로 간격이 긴 k-1개를 제외하고 합한다. n = int(input()) k = int(input()) sensor = list(map(int, input().split())) sensor.sort() sensor_distance = [] for i in range(..
문제 : https://www.acmicpc.net/problem/16954 🔑 BFS 먼저 벽이 내려온 상태를 모두 만들었다. (8 개 이후는 벽이 모두 사라지기 때문에 8 개까지) 이전 맵 상태를 가져와서 벽을 내리는데 이때 리스트가 얕은 복사가 되지 않게 주의 그리고 이동 방향은 제자리, 상하좌우, 대각선 총 9개의 방향 제자리 위치하는 방향(i = 0) 일 때도 큐에 넣을 수 있게 방문 처리를 해제했다. 이것 때문에 79% 에서 막혔다가 위 조건 추가로 문제 해결 현재 깊이에 맞는 벽 상태를 보고 갈 수 있는지 확인 (현재 깊이) 갔다면 벽이 내려오고 나서 벽에 안 부딪히는지 확인 (현재 깊이 + 1) 두 조건 만족하면 큐에 추가 도착지에 도착했거나 깊이가 8 이상이 되면 정답 처리하고 끝 ✨ f..
문제 : https://www.acmicpc.net/problem/1654 🔑 이분탐색 기준 값 (mid) 값으로 각각의 줄을 나눠서 n개를 나눌 수 있는 최댓값을 찾는다. mid 값으로 n개의 줄을 만들 수 없으면 오른쪽 포인터 값 r을 mid 값 -1로 바꿔준다. 만들 수 있으면 왼쪽 포인터 값 l을 mid 값 +1로 바꾼다.(n개를 만들 수 있는 최댓값을 찾기 위해) import sys input = sys.stdin.readline k, n = map(int, input().split()) lines = [int(input()) for _ in range(k)] l = 1 r = 2**31 mid = 0 while l cnt: r = mid - 1 else: l = mid + 1 print(r)
문제 : https://www.acmicpc.net/problem/1655 🔑 최대 힙과 최소 힙을 함께 사용 import sys from heapq import heappush, heappop input = sys.stdin.readline n = int(input()) num = int(input()) print(num) minHeap, maxHeap = [],[-num] for i in range(n-1): num = int(input()) if num > -maxHeap[0]: heappush(minHeap, num) else: heappush(maxHeap, -num) if len(minHeap) > len(maxHeap): temp = heappop(minHeap) heappush(maxHea..
문제 : https://www.acmicpc.net/problem/1238 🔑 다익스트라 각 마을에서 도착지까지의 거리를 저장 [INF, 1, 0, 3, 7] 도착지에서 각 마을까지의 거리를 저장 [ 0, 4, 0, 6, 3] 그래서 총 n번의 다익스트라를 진행 0번 인덱스 제외 각 인덱스의 합이 가장 큰 거리가 정답 from collections import defaultdict from heapq import heappush, heappop n, m, x = map(int, input().split()) # n명 학생(마을), m개의 단방향 도로, x도착지 graph = defaultdict(list) for i in range(m): s, e, t = map(int, input().split()) ..
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42892 🔑 DFS) 왼쪽 트리, 오른쪽 트리를 나누자 사전 작업 : 노드 번호가 없기 때문에 노드 번호를 추가, y값 기준 내림차순 정렬 순회 함수 진입 부모 노드의 x 값 보다 자식 노드의 x 값이 작으면 left 리스트에 추가 반대면 right 리스트에 추가해서 왼쪽, 오른쪽 트리를 구분 전위는 재귀 들어가기 전에 부모 노드의 번호를 저장 후위는 재귀 나오고 나서 부모 노드의 번호를 저장 left 리스트에 노드가 있으면 left 리스트를 가지고 재귀 진행 가지고간 left 리스트에 대해서도 left, right 리스트로 나눈다 left 리스트에 노드가 없으면 right 리스트로 재귀 진..