본문 바로가기

알고리즘26

[백준 2156 파이썬] 포도주 시식 백준 2156번 python 포도주 시식문제 DP 3잔을 연속해서 마시지 않고 최대한 많은 와인을 마셔야하는 문제 3개의 case로 나누었다. 와인이 4잔 있을 경우 case1: 현재의 와인(와인4)을 마시고 이전의 와인(와인2)를 마시지 않고 그 전의 마실 수 있는 와인의 최대치를 마심 case2: 현재의 와인(와인4)과 이전의 와인(와인3)를 마시고 와인2를 못마시는경우 case3: 와인2과 와인3를 마셔 현재의 와인4를 마시지 못하는경우 case1: wine4 + (wine1+wine2) case2: wine4 + wine3 + (wine1) case3: wine2 + wine3 이런식이 될것임 n = int(input()) wine = [0] dp = [0] [wine.append(int(inpu.. 2021. 3. 12.
[백준 11399 파이썬] ATM 문제를보고 운영체제의 SJF 스케쥴링이 떠올랐다. Shortest Job First(SJF) 즉 가장 인출시간이 짧은 사람을 우선으로 정렬하고 인출시간을 구하면 된다. import sys n = map(int, sys.stdin.readline()) arr = list(map(int,sys.stdin.readline().split())) arr.sort() waiting_time=0 sum = 0 for i in arr: waiting_time += i sum += waiting_time print(sum) 개인당 대기시간(waiting_time)을 각각 구해주고 그 합(sum)을 출력해준다. 2021. 3. 11.
[백준 1931 파이썬] 회의실 배정 회의실 예약을 위해 시작시간과 종료시간을 n번 입력받기위해 2차원의 리스트를 생성해준다. n = int(sys.stdin.readline()) room = [[0]*2 for _ in range(n)] 그리고 시작시간의 오름차순으로 정렬해주고 다시 끝나는 시간의 오름차순으로 정렬을 해준다. 그럼 시작시간과 끝나는시간이 같은경우에도 앞서 시작시간을 오름차순으로 정렬했기 때문에 카운팅될 수 있다. room = sorted(room, key=lambda a: a[0]) room = sorted(room, key=lambda a: a[1]) 키에 익명함수사용을 위한 람다를 사용했는데 리스트형태의 인자를 받아 분리하여 반환하고 이를 키값으로 사용하여 정렬한다. key 매개 변수의 값은 단일 인자를 취하고 정렬 목.. 2021. 3. 10.
[백준 11047] 파이썬 동전 0 그리디 알고리즘을 사용해서 문제를 풀이했다. 그리디 알고리즘문제이기 때문에 .. 오름차순으로 동전의 가치가 주어지므로 동전 개수의 최솟값을 구하기 위해서는 최대한 비싼 동전을 써야한다. 따라서 리스트에 동전을 하나씩 추가해주고 뒤에서부터 조회하며 준규의 동전에서 빼줬다. n,k = map(int, input().split()) coin = [] count = 0 for _ in range(n): coin.append(int(input())) for i in range(len(coin)-1,-1,-1): count += k // coin[i] k = k - k // coin[i] * coin[i] print(count) 2021. 3. 7.
[백준 파이썬 1002] 백준 python 터렛 1002번 x1,y1,r1,x2,y2,r3 으로 상대편 마린의 위치를 계산하는 문제임. 그림으로 그려보니 두 원의 접점을 구하는 문제임이 보였다. mathbang.net/101 두 원의 위치관계, 내접, 외접 위치관계 또 나오네요. 이번에는 두 원의 위치관계에요. 위치관계 마지막이니까 정신 바짝 차리고 따라오세요. 원과 직선의 위치관계, 원의 할선과 접선, 접점에서 했던 것처럼 두 원이 어떤 관 mathbang.net 두 원이 2점에서 만나는 경우, 1점에서 만나는경우와 만나지 않는 경우 그리고 겹쳐서 무한대일 경우가 있을 것이다. 출력 부분을 보면 무한대일 경우 -1 을 출력하라고 했다. import sys T = int(sys.stdin.readline()) for i in range(T): x1, y1, r1.. 2020. 11. 15.
백준 1110번 파이썬 : 더하기 사이클 해당 문제는 입력받은 숫자를 10의 자리와 1의 자리로 나눠서 1의자리값과 10의자리와 1의자리를 더한 값의 1의자리를 계속해서 더해나가다 처음의 숫자를 찾아내는 문제이다. import sys count = 0 n = num = int(sys.stdin.readline()) while(True): ten = n // 10 one = n % 10 total = ten + one count += 1 n = int(str(n % 10) + str(total % 10)) if (num == n): break print(count) 우선 입력 받은 값을 두개의 변수에 할당한다. 하나는 자릿수로 나눠담을 변수고, 하나는 끝에 찾아낼 변수 그다음 while문 내부에 10의자리를 담을 ten 에는 n을 10으로 나눠 .. 2020. 8. 14.
백준 10952번 파이썬 (python) : A+B - 4 10951 번문제와 상당히 비슷해 보이는 문제이지만. 이번엔 입력의 끝을 구분해서 계산을 끝내는 문제이다. 코드 import sys for line in sys.stdin: A,B = map(int,line.split()) print(A+B) 이런식으로 제출해도 문제는 맞은걸로 처리는된다. 다만 ValueError 가 발생 하는 것이 마음에 들지 않았다. [for문에서 sys.stdin 을 사용하는 이유는 따로 게시함.] import sys while(True): try: A,B = map(int,sys.stdin.readline().split()) print(A+B) except ValueError: break 그래서 나는 try except 를 사용해서 문제를 해결했다. 결과는 통과. 2020. 8. 14.
백준 10952번 파이썬 (python) : A+B - 5 while 문을 사용해서 두 정수가 0 0 이 들어올때 까지 A+B를 계산해야 하는 문제 이를 위해서는 "1 1" 이라는 입력을 문자열로 받아서 split()함수를 사용해서 두 숫자를 분리하는 과정을 거쳐야한다. 그리고 분리한 값을 다시 int형으로 저장해야하는데. map함수를 사용한다. https://www.w3schools.com/python/ref_func_map.asp Python map() Function Python map() Function ❮ Built-in Functions Example Calculate the length of each word in the tuple: def myfunc(n): return len(n) x = map(myfunc, ('apple', 'banana', .. 2020. 8. 14.
[백준 2750] 파이썬 삽입정렬 삽입정렬은 리스트의 2번째요소에서 시작해서 앞의 요소들과 비교해서 위치를 찾아가는것이다 코드 구현이 쉽고 데이터크기가 작은경우 복잡하게 구현된 코드들보다 빠를수있으나 코드가 커질수록 비효율적이고 최악의경우 N^2 의 시간복잡도를가짐 파이썬코드 import sys list=[] N = int(sys.stdin.readline()) for i in range(0,N): list.append(int(sys.stdin.readline())) for i in range(1,N): for j in range(i,0,-1): if list[j] < list[j-1]: list[j], list[j-1] = list[j-1], list[j] else: break for i in list: print(i) 2020. 2. 12.
[백준 1932] 정수삼각형 파이썬 파이썬 문법이 익숙하지 않아서 애먹었다. 우선 어떻게 해결할지 고민했는데 처음엔 제일 위에서 부터 큰 숫자를 찾으려 했으나 왼쪽 혹은 오른쪽 대각선만 선택할수 있어서 다른 방법을 찾아야했다. 일단 입력을 다 배열로 받고 [7] [3,8] [8,1,0] [2,7,4,4] [4,5,2,6,5] 위에서 부터 대각선에 해당하는 값을 아래에 더해주며 내려온다. 그럼 --- [7] [10,15] --- 이런식으로 시작을 할텐데 문제는 3,8 에서 8,1,0이 있는 행으로 내려올때 1이 3과 8 양쪽의 대각선에 해당된다. 이럴 땐 max로 해결해줌 [7] [10,15] [18,max([11],[16]),15] --- 이런식으로 쭉 내려오다 보면 제일 마지마지막 줄에서 가장 큰값이 최댓값이 되겠다 import sys .. 2020. 1. 29.
백준 9416번 파이썬 (python) : 파도반 수열 문제는 이러하고 파도반 수열의 규칙을 찾다보니 피보나치 수열이랑 비슷한 느낌의 그림을 볼 수 있었다. P 는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9 그림을 1부터 시작해서 따라가다 보면 알겠지만 6번째 숫자부터 dp[ i ] = dp [ i - 1 ] + dp[ i - 5 ] 의 점화식이 세워지는 것을 알 수 있다. import sys def padovan(n): arr=[1,1,1,2,2] if n < 6 : return arr[n-1] for i in range(5,n+1): arr.append(arr[i-1]+arr[i-5]) return str(arr[n-1]) M = int(sys.stdin.readline()) arr = [] for i in range(M): arr.append(.. 2020. 1. 27.