
백준 알고리즘 파이썬(Python) 2579번 계단오르기
2021. 7. 30. 13:18
Algorithm
우선 문제의 세 가지 규칙 중 마지막 규칙을 주의 깊게 봐야 한다. 마지막 도착 계단은 반드시 밟혀있어야 하므로 가장 마지막 계단에서부터 시작하는 것이 좋다. 맨 마지막 계단이 밟혀있다고 가정해보자. 그렇다면 그 전의 계단은 "마지막 - 1" 계단이거나, "마지막 - 2" 계단 일 것이다. 두 개의 경우에 문제 2번 조건을 적용시켜보자 1) 그전에 밟은 계단이 "마지막 - 1" 일 경우 반드시 "마지막 - 2" 계단을 밟으면 안 된다. - 연속된 3개의 계단을 밟아서는 안되므로 2) 그 전에 밟은 계단이 "마지막 - 2"일 경우 그 전 계단은 신경 쓰지 않는다. - 다이내믹프로그래밍을 적용시키면 되므로 내가 만약 다이나믹 프로그래밍을 통해 배열 "dp"에 앞에서부터 밟아온 계단 중 가장 최대의 값을 저장..

백준 알고리즘 파이썬(Python) 1158번 요세푸스 문제
2021. 7. 28. 11:42
Algorithm
1부터 n까지 순서대로 사람을 앉힌 다음에 index번호가 k-1인 사람을 제거 후 temp += k-1 을 통해 temp를 늘려가며 제거한다. 하지만 그러다 보면 temp가 리스트의 len을 넘어가는 순간이 올 수 밖에 없다. (우리가 쓰는 리스트는 원형이 아니므로) 그럴땐 전체 temp를 리스트의 len으로 나눈 나머지의 값으로 temp을 되돌려 놓는다. 그렇게 하면 원형으로 돌아가며 제거하는 것과 같은 효과를 낸다. 코드 n, k = map(int, input().split()) arr = [i for i in range(1, n + 1)] answer = [] num = k - 1 for i in range(n): if len(arr) > num: answer.append(arr.pop(num))..

백준 알고리즘 파이썬(Python) 11279번 최대 힙
2021. 7. 28. 10:37
Algorithm
파이썬의 heapq(힙 큐) 내장 모듈을 사용하여 푸는 문제이다. heapq 모듈은 이진 트리(binary tree) 기반의 최소 힙(min heap) 자료구조를 제공한다. 이진트리 기반의 최소 힙을 그림으로 쉽게 나타내면 다음과 같다. heapq 모듈의 heappush() 함수를 이용하여 힙에 원소를 추가할 수 있다. 첫 번째 인자는 원소를 추가할 대상 리스트이며 두 번째 인자는 추가할 원소를 넘긴다. heapq.heappush(heap, 4) heapq.heappush(heap, 1) heapq.heappush(heap, 7) heapq.heappush(heap, 3) print(heap) #출력값 -> [1, 3, 7, 4] heapq 모듈의 heappop() 함수를 이용하여 힙에서 원소를 삭제할 ..

백준 알고리즘 파이썬(Python) 9012번 괄호
2021. 7. 22. 14:43
Algorithm
처음에는 ( 가 나온다면 +1을 해주고 ) 가 나온다면 -1 을 해주어서 마지막 총합이 0이 나오면 YES를 출력해주고 총합이 0이 아니라면 NO를 출력해주려고 했다. 하지만 ( ) ) ( ( ) 같은 경우 가운데 ' ) ( ' 때문에 합이 0이 나오지만 VPS 즉 괄호가 닫히지 않는다. 그래서 생각해본 방법은 입력값을 문자열로 받은 다음 ' ( ) ' 가 있다면 While 문과 replace를 사용하여 지속해서 ' ( ) ' 를 삭제해주고 마지막까지 문자열의 길이가 0 이 아니라면 N0, 0이라면 YES를 출력해 주는 것이다 n = int(input()) for i in range(n): data = input() answer = True while answer == True: #while문을 이용해 ..

백준 알고리즘 파이썬(Python) 5397번 키로거
2021. 7. 19. 20:31
Algorithm
커서의 위치를 0으로 두고 입력값에 따라 커서의 위치를 변경시켜 가는 생각을 가장 먼저 했다. 하지만 전체 테스트 케이스가 1,000,000개로 매우 큰 편이므로 이럴 경우 시간 초과가 날 확률이 크다 생각을 바꿔서 커서를 움직이는 것이 아닌 커서를 놓고 양쪽 문자열을 옮긴다고 생각하면 쉽다. 커서를 중간에 놓고 Left 리스트와 Right 리스트를 pop을 이용해 뺀 값을 서로에게 주고 받으면서 문제를 풀어나가면 된다. n = int(input()) for i in range(n): left = [] right = [] case = input() for j in range(len(case)): if case[j] == '-': if left: # left리스트에 값이 있을 경우만 실행 left.pop(..