https://www.acmicpc.net/problem/7662 항상 순서가 정렬되어야 하고, 가장 앞&뒤에서 값을 빼야 할 때 사용할 수 있는 데이터타입은 여러 가지 있겠지만, 최대한 검색 시간을 줄이기 위해서 heap을 두 가지 사용하였다.maxheap은 숫자에 -1을 곱해서 넣어서, 가장 큰 값에 -1이 곱한 수가 가장 위에 오도록 하고, minheap은 그대로 넣어서 오름차순으로 정렬되도록 하였다. 이때 minheap이든 maxheap이든, 가장 위에 있는 값을 뺀 다음에는 다른 heap에서 그 값을 빼야 할 텐데, 그렇게 하면 시간 초과가 된다!!따라서 현재 있는 인덱스를 chk라는 세트에 저장해두고, 만약 나중 차례에 뺀 값이 이 안에 없다면 이미 제거된 값이라는 뜻이므로 다음으로 위에 있는..
https://www.acmicpc.net/problem/16928문제를 읽자마자 당연히 이전 방문보다 다음 방문이 더 카운트가 크므로 DP구나 싶었다그러나 snake를 통해 방문한 게 더 작은 주사위 카운트가 될 수도 있다는 것을 보고 조금 수정하게 되었다.snake의 머리가 있는 곳에 방문할 경우,1. 만약 머리가 있는 곳의 값이 꼬리가 있는 곳의 값보다 작다면 꼬리가 있는 곳의 값을 머리가 있는 곳의 값으로 바꾸고, 꼬리의 좌표로 이동하여 다시 진행한다. 단, 머리가 있는 곳은 다시 방문할 수 없게 하거나 혹은 다른 곳처럼 주사위로 갈 수 있다고 헷갈리지 않게 100을 넣는다.2. 머리가 있는 곳의 값이 꼬리가 있는 곳보다 크다면 그냥 헷갈리지 않게 머리에 100을 넣는다. 꼬리가 있는 곳으로 다시..
https://www.acmicpc.net/problem/2156 각 포도주마다 선택할 수 있는 선택지는 두 가지가 있다. 1. 지금 마신다2. 마시지 않는다 그러나 포도주를 3잔 연속 마실 수는 없기 때문에, 직전에 마셨고 이번에 마셨다면 다음에 마실 수 없다.따라서 연속으로 포도주를 마신 횟수에 따라 배열에 저장한다면 dp 배열은누적 0번 | 1번 | 2번위와 같은 형태가 될 것이다.누적 0번의 경우, 직전에 몇 번을 마셨든 이번 순서에 마시지 않는 것이기 때문에 직전 순서의 max 값을 가져오면 된다.누적 1번의 경우, 직전까지 0번 누적이고 이번 순서에서 마시는 것이기 때문에 이번 포도주의 양 + 직전 누적0번의 값이다.누적 2번의 경우, 1번과 동일하게 이번 포도주의 양 + 직전 누적 1번의 값..
https://www.acmicpc.net/problem/6603import sysinput=sys.stdin.readlinewhile True: arr = list(map(int, input().split())) if arr[0]==0: break k = arr[0] s = sorted(arr[1:]) def dfs(now, len, k, s, ans): ans.append(s[now]) if len==6: print(*ans) else: for x in range(now+1, k): dfs(x, len+1, k,s, ans) if ans: ans.pop..
https://www.acmicpc.net/problem/2473https://wondev.tistory.com/138 [백준] 2473. 세 용액 - 파이썬[Gold III] https://www.acmicpc.net/problem/2473 2473번: 세 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이wondev.tistory.comimport sysinput = sys.stdin.readlinen = int(input())arr = list(map(int, input().split()))arr.sort()def find(arr, n): res =[1000000000,1000000000,..
https://www.acmicpc.net/problem/2110import sysinput = sys.stdin.readline# 최소 인접 거리가 최소가 되게 -> 이분 탐색 사용n, c = map(int, input().split())arr=[]for _ in range(n): arr.append(int(input()))arr.sort() #오름차순 정렬left = 1right=arr[-1]-arr[0] #최소 거리를 이분탐색으로 찾는 것while left= curr+mid: cnt+=1 curr=arr[i] if cnt>=c: left=mid+1 else: right=mid-1print(right)
https://school.programmers.co.kr/learn/courses/30/lessons/43238 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr처음엔 프로세스의 스케줄링 기법을 떠올렸는데, 최소 시간을 보장해야 하기 때문에 고민이 됐다..그렇다고 매 스케줄마다 지금 당장 들어가기 vs 대기해서 들어가기 판별해서 하기에는 전체 최소 시간을 보장하지 않는 그리디한 방법이기 때문에 이 방법은 옳지 않아 보였다. 문제가 이분 탐색으로 구분되어 있고, 다른 분들의 답변을 확인해 본 결과 총 시간을 늘려가보면서 해당 시간에 처리할 수 있는 스케줄의 개수를 찾고, 이 스케줄 개수가 주어진 n보다 작다면 시간..
https://www.acmicpc.net/problem/2468 dfs를 통해 물 높이별 영역의 수를 찾아내는 것이 주요 내용이다.import syssys.setrecursionlimit(10**6)input= sys.stdin.readlinen = int(input())graph=[]max_height=0min_height=100for _ in range(n): arr = list(map(int, input().split())) max_height = max(max_height, max(arr)) min_height = min(min_height, min(arr)) graph.append(arr)cnt=[n*n]max_area=1mv = [(-1,0),(1,0),(0,-1),(0..
https://www.acmicpc.net/problem/2573import syssys.setrecursionlimit(10**6)input=sys.stdin.readlinen,m=map(int, input().split())graph=[[0 for _ in range(m)] for _ in range(n)]ice = [] # 빙하 좌표for i in range(n): arr = list(map(int, input().split())) for j in range(m): if arr[j]>0: ice.append([i,j,arr[j]]) # y, x, 값 graph[i][j] = arr[j]mv = [(-1,0),(1,0),(0,-1),(0,..