남아있는 일 수와 이익끼리의 조합 중 조건에 맞는 조합쌍을 찾고, 그 중에서 이익 합계가 최대가 되도록 하는 쌍을 선택하는 브루트포스 알고리즘 문제이다. N = int(input())T = [0] * NP = [0] * Nfor i in range(N): T[i], P[i] = map(int, input().split())# 퇴사 이후까지 기간이 넘어가는 것들부터 삭제for i in range(N-1, -1, -1): if (N-i T와 P를 각각 N개의 원소를 가진 리스트로 생성하여 순서대로 입력받았고,그 다음에 퇴사 이후까지 기간이 넘어가는 일정을 삭제하기 위해 마지막 일정부터 역으로 거슬러 올라가면서 기간이 초과되는 일정의 T와 P 원소를 pop 해주었다.이렇게 상담이 가능한 일정들에 ..
Python
이 문제는 알고보면 쉬운 문제지만, 문제의 설명 자체가 너무 부실하고 이상해서 애를 먹었던 문제다...문제 설명만 보면 골드가 아깝지 않을 정도로 전혀 이해가 되지 않아 나와 같은 처지의 사람들이 모인 질문 게시판의 답변을 들락거리면서 간신히 이해했다.(백준 자체에 좀 설명이 이상한 문제들이 꽤 있는 듯 함...) 내가 작성해본 예시로 간단히 설명해보겠다. 만약 X = 10을 입력한 경우, 합계와 자른 막대기들의 구성이 다음과 같은 과정으로 변하게 됨64 sum: 64 lst: [64]-> 32 sum: 32 lst: [32]-> 16 sum: 16 lst: [16]-> 8 / 8 sum: 16 lst: [8, 8]-> 8 / 4 sum: 16 lst: [8, 4..
입력할 내용들이 꽤 많아서 각각의 용도에 따라 그에 맞는 자료구조들을 각각 생성했다. N, M = map(int, input().split())score = list(map(int, input().split()))arr = [[0]*(N+1) for _ in range(M)] # M개의 행 N+1 개의 열profile = {} # 학번과 점수 기록for i in range(M): num = 0 arr[i] = input().split() # arr[0] = [1, O, X, X, X] for j in range(N+1): if j!=0 and arr[i][j] == 'O': num += score[j-1] profile[arr[i][0]] = nummax_value = ..
처음에 사람들마다 각각 인출하는데 걸리는 시간이 할당되어 있길래 위상 정렬같은 문제인 줄 알았는데, 막상 풀어보니 그냥 배열만 사용하면 되는 실버 4치고 매우 쉬운...문제였다. N = int(input()) # 5time = sorted(list(map(int, input().split()))) # 3 1 4 3 2 -> 1 2 3 3 4sum = 0temp = 0arr = [0]*Nfor i in range(N): arr[i] += (time[i] + temp) temp = arr[i] sum += arr[i]print(sum) 먼저 사람의 수인 N을 입력 받고, time 리스트를 숏코딩으로 사람들 각각의 시간을 입력한 뒤 최솟값을 구해야 하기 때문에 리스트를 오름차순으로 정렬해준다...
처음에 그림 봤을 때부터 바로 조합이 떠올랐던 문제였지만,조건 중에 '다리끼리는 서로 겹쳐질 수 없다'고 해서 직접 그려봤다. M개에서 N개를 중복 없이 선택하는데, 여기서 다리가 교차되는 경우가 조금 헷갈렸다.그러나 해당 조건 하에 직접 그려서 세어본 결과 일반 조합의 계산결과와 동일했는데, 조합의 개념을 잘 생각해보면 쉽다. 조합은 순열과 달리 뽑는 순서 자체를 고려하지 않기 때문에 서쪽의 (1,2)가 각각 동쪽의 (1,4)를 선택하던 (4,1)을 선택하던 모두 하나의 경우의 수로 처리되게 된다.따라서 애초부터 다리가 교차되면 안된다는 조건은 조합 개념 자체에 포함되어 있는 것으로 판단할 수 있었다!즉, 서쪽이 N개, 동쪽이 M개이고 M개 중에 N개를 연결시키는 것이므로 조합으로 따지면 mCn을 계산..