알고리즘/백준 문제풀이 52

[백준] 11279 최대힙 파이썬 풀이 (힙)

힙이란? 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 완전 이진트리 최대힙과 최소힙 최소힙은 최소값이 가장 상위에 있고 부모 노드가 자식 노드보다 값이 작아야한다. 최대 힙은 최대값이 가장 상위에 있고 자식 노드가 부모 노드보다 값이 작아야한다. 문제 값을 넣고 0을 입력하면 배열에서 가장 큰 값을 출력해라 문제풀이 heapq에서는 최소 힙을 제공하기때문에 값을 -를 붙인 key값으로 heap에 넣는다. 그러면 가장 큰 값이 가장 상위에 올라가게된다. 그리고 출력할때는 value값으로 출력한다. 코드 import sys import heapq as hq numbers = int(input()) heap = [] for i in range(numbers): num = int(sys.stdin.re..

[백준] 2606 바이러스 파이썬 풀이(DFS와 BFS)

문제 컴퓨터끼리 연결된 쌍이 주어진다. 1번 컴퓨터가 웜 바이러스에 걸렸을때 연결된 모든 컴퓨터가 웜 바이러스에 걸린다. 바이러스에 걸리는 컴퓨터의 수를 출력해라 문제풀이 DFS로 푼다. 연결되어있는 노드를 끝까지 탐색해야하기 때문. 2차원 배열에 연결되어있는 값을 저장한다. 1번 노드에 연결된 모든 값을 visited_dfs에 저장하고 1번의 뺀 개수를 출력한다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 정점의 연결정보 입력받기 n= int(input()) #정점 m = int(input()) #연결수 graph = [[] for _ in range(n+1)] for _ in range(m): a, b = map(int, inp..

[백준] 11399 ATM 파이썬 풀이 (그리디)

문제링크 문제 사람마다 atm기에 있는 시간이 다르다. 모든 사람이 돈을 인출하는데 필요한 시간의 합이 가장 작도록 만들어라 그리고 그 합을 출력해라 문제 풀이 시간이 주어질때 앞에서부터 작은 시간이 걸리는 순서대로 줄을 서면 합이 가장 작아진다. 입력 1을 봤을때 1 2 3 3 4 순서로 서야 최소의 값이 나온다. time에 시간을 리스트로 저장하고 오름차순으로 sort한다 time[i]번째 사람이 걸리는 시간은 그 전까지의 시간을 다 더한 것에 자신의 시간을 더한 시간이다. 코드 import sys num = int(sys.stdin.readline()) time = list(map(int,sys.stdin.readline().split())) time.sort() # print(time) sum =..

[백준] 11047 동전0 파이썬 풀이 (그리디)

문제 k원을 만드는데 필요한 동전 개수의 최솟값을 출력하라 문제 풀이 입력받은 코인을 배열에 저장하고 내림차순으로 정렬한다. k원보다 코인이 큰 것은 지나가고 k원보다 작아지면 k원을 coin으로 나눌 수 있는 지 확인한다 나눌 수 있으면 몫이 coin의 개수이고 나머지가 남으면 나머지를 다음으로 작은 코인으로 나눈 것을 더하면 된다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import sys kind_of_coin, money = map(int,sys.stdin.readline().split()) coins = [] for _ in range(kind_of_coin): coin = int(sys.stdin.readline()) coins.append(coin) coins.rev..

[백준] 1541 잃어버린 괄호 파이썬 풀이 (그리디)

문제 주어진 식에 괄호를 적절히 쳐서 식의 값을 최소로 만들어라 문제 풀이 처음에 55-50+40을 보고 그냥 +를 다 마이너스로 바꾸면 되지 않을까라고 생각했다. 그런데 55+50+40-30+20+10 이면 40 뒤에부터 -로 바꿔야하기 때문에 일단 -를 기준으로 입력값을 split하여 배열에 넣는다. 그리고 첫번째로 들어가 있는 값에서 그 뒤의 모든 값을 빼준다 코드 # ------------------------------ arr = input().split('-') # print(arr) result = 0 for i in arr[0].split('+'): result += int(i) for i in arr[1:]: for j in i.split('+'): result -= int(j) prin..

[백준] 1002 피보나치 함수 파이썬 풀이 (동적계획법)

문제 피보나치 함수를 구할때 0과 1이 몇 번 호출되는지 구하여라 문제 풀이 fn_2 에 fibonacci(n-2)의 0의 개수와 1의 개수를 저장한다. fn_1에 fibonacci(n-1)의 0의 개수와 1의 개수를 저장한다. fn에 fibonacci(n)의 0의 개수와 1의 개수를 저장한다. fn의 0의 개수는 fn_1의 0의 개수와 fn_2의 0의 개수를 더한 것이다. fn의 1의 개수는 fn_1의 1의 개수와 fn_2의 1의 개수를 더한 것이다. fn에 저장해주고 나서 fn_1에 있던 값을 fn_2로 옮기고 fn에 있던 값을 fn_1로 옮긴다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 num = int(input()..

[백준] 2231 분해합 파이썬 풀이 (브루트포스)

백준 문제 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합이다. 어떤 자연수 M의 분해합이 N인 경우 M을 N을 생성자라고 한다. 자연수 N이 주어졌을때 N의 가장 작은 생성자를 구해라 문제풀이 주어진 숫자까지 1부터 분해합을 구한다. 중간에 분해합이 주어진 숫자와 같아지는 순간 break하고 출력한다. 중간에 break될 경우 check를 False에서 True로 바꾼다 check가 False로 끝까지 남았을 경우 주어진 숫자의 생성자가 없다는 뜻이다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 num = int(input()) check = False for i in range(1,num+1): generated = 0 splits= [] for j in ..

[백준] 2798 블랙잭 파이썬 풀이 (브루트포스)

백준 문제 카드 3장을 뽑아 M을 넘지 않으면서 M에 최대한 가까운 합을 만들어라 문제 풀이 한개씩 카드를 뽑아서 합이 M보다 크면 넘어가고 M과 같거나 같으면 그 합이 가장 큰 것을 result에 담아서 출력한다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 N,M = map(int, input().split()) numbers=list(map(int, input().split())) # print(numbers) result = 0 for i in range(N): for j in range(i+1, N): for k in range(j+1, N): if numbers[i] + numbers[j] + numbers[k] >M: continue else: result = max(re..

[백준] 1002 터렛 파이썬 풀이 (기본 수학)

문제 조규현의 좌표 (x1, y1)과 백승환의 좌표(x2,y2)가 주어지고 조규현과 류재명의 거리 r1, 백승환과 류재명의 거리 r2가 주어진다. 류재명이 있을 수 있는 좌표의수를 출력하라 문제 풀이 조규현의 좌표를 중심으로 r1을 반지름으로 하는 원의 테두리의 모든 좌표가 류재명이 있을 수 있는 거리이다 백승환의 좌표를 중심으로 r2를 반지름으로 하는 원의 테두리의 모든 좌표가 류재명이 있을 수 있는 거리이다. 이때 두 원이 한 점에서 접하면 류재명이 있을 수 있는 좌표는 1개이다. 두 원이 두점에서 접하면 류재명이 있을 수 있는 좌표는 2개이다. 두 원이 접하지 않으면 류재명이 있을 수 있는 좌표는 0개이다. 두 원이 일치하면 류재명이 있을 수 있는 좌표는 무한개이다. 코드 1 2 3 4 5 6 7 ..

[백준] 2579 계단 오르기 파이썬 풀이 (동적 계획법)

문제 계단은 한번에 한 계단 or 두 계단씩 오를 수 있다. 연속 세개를 밟으면 안된다. 마지막 도착 계단은 반드시 밟아야한다. 이때 얻을 수 있는 점수의 최댓값을 구해라 문제 풀이 계단이 1개일때는 1개만 밟을 수 있다 계단이 두개일때는 두개 다 밟을 수 있다. 계단 세개일때는 마지막 계단은 꼭 밟아야하니, 첫번째 계단과 두번째 계단 중에서 점수가 높은 것을 밟을 수 있다. 계단이 네개 이상일때는 그 전 계단을 밟은 게 점수가 큰지, 전 계단을 안밟은게 점수가 큰지 확인한다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import sys step_total = int(input()) steps = [] for _ in range(step_tot..