
백준 알고리즘 파이썬(Python) 13305번 주유소
2021. 5. 2. 01:57
Algorithm
일반적인 그리디 문제처럼 이문제에서 중요한 것은 리스트를 만들어 알맞은 값으로의 최신화이다 핵심은 왼쪽에서부터 순차적으로 도시의 기름값을 확인하여 min값을 최신화 해주는 것이다. 그리디의 핵심은 가장 최적의 경우를 탐색해 찾아내는 것 n = int(input()) #도시개수를 입력받는다. road = list(map(int, input().split())) #도시 사이의 거리를 입력받는다. city = list(map(int, input().split())) #도시의 기름값을 입력받는다. min_val = city[0] #min_val 값을 첫 도시의 기름값으로 price_sum = 0 #price_sum 0으로 초기값 설정 for i in range(n-1): if min_val > city[i]: ..

백준 알고리즘 파이썬(Python) 1343번 폴리오미노
2021. 4. 16. 22:07
Algorithm
뭔가 그리디스럽지 않다고 생각한 문제이다. 처음에는 당연히 ' . ' 를 기준으로 split 해야하는줄 알고 많이 헤맸던거 같다 (뭐 안헤매는 문제가 적지는 않지만...) 그러다 문득 split 하지 않고 문자열로 생각해 보면 쉽지 않을까 라는 생각이 들었고 그 결과 단 몇줄만의 코드로 풀이가 가능하다는 것을 알았다. 이 문제의 핵심은 replace의 정확한 사용법을 아느냐 이다. 만약 'XXXXX' 이렇게 연속된 5개의 X가 있을때 replace('XXXX', 'AAAA')를 해준다면 replace는 각각의 인덱스, 즉 0의 위치부터 순서대로 'XXXX'를 찾아내어 그것을 명령대로 바꿔준후 다시 'XXXX'를 찾아나선다 즉 'AAAAX' 이렇게 변한다는 뜻이다. 그동안 replace를 공부할때는 [ '..

백준 알고리즘 파이썬(Python) 19598번 최소 회의실 개수
2021. 4. 15. 12:20
Algorithm
굉장히 골머리를 먹었던 문제다. 이 문제는 앞서 회의실배정 문제와 유사한듯 하나 알고리즘이 훨씬 복잡한 문제였다. N = int(input()) #N개의 회의실을 부여받는다. metting = [] #빈 리스트를 생성한다. for _ in range(N): start,end = map(int,input().split()) #회의 시작시간과 끝나는 시간을 입력받는다. metting.append([start,1]) #시작시간에는 1과 함께 metting.append([end,-1]) # 끝나는 시간에는 -1 과 함께 라스트에 추가해준다. metting.sort() #metting 리스트의 원소 [a,b] 에서 a의 오름차순으로 정렬 room = 0 metting_cnt = 0 for _,state in me..

백준 알고리즘 파이썬(Python) 2217번 로프
2021. 4. 14. 20:51
Algorithm
처음 문제를 봤을때 바로 이해되는 않았던 문제다. 그리고 처음 제출땐 매우 중요한 부분을 간과하고 제출해 실패의 고배를 마셨다. 바로 "모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다" 이부분이다. 처음에 이부분을 간과해 그냥 로프 최대중량을 리스트에 넣은다음 가장 작은값(min)에 n을 곱해 답을 구했다. 하지만 모든 로프를 사용하지 않아도 되므로 이렇게 풀어서는 안된다. 이 부분의 해결법은 모든 리스트들을 오름차순으로 정렬하고 가장 작은 값부터 차례대로 모든 원소에 곱해나가며 하나씩 제거해 그 값들중 가장 큰 값을 출력하는 것이다. 말로 하면 어려우니 코드를 보자. n = int(input()) array = [] for _ in range(n): a = int(..

백준 알고리즘 파이썬(Python) 14916번 거스름돈
2021. 4. 14. 20:16
Algorithm
지난번 설탕배달(2839번) 문제와 매우 유사한 문제이다. 사실 같은 문제라고 봐도 무방하다. 설탕배달 문제를 풀 때는 일일히 5로 나눈 나머지가 1일때, 2일때, 3일때 ... 그야말로 삽질을 여러번 했는데 이번에는 그래도 while 문을 사용해 빠르게 해결했다. n = int(input()) cnt = 0 while True: if (n%5) == 0: cnt = cnt + (n//5) print(cnt) break n = n - 2 cnt = cnt + 1 if n < 2: #각자 판단할 것이 다르면 elfi가 아닌 if를 써준다. print(-1) break 여기서 한가지 주의할 점은 if가 나온뒤 elif 가 아닌 다시 if 가 나오는 것이다. 위에 if문과 아예 다른것을 판단하기 때문에 eli..