문제풀이: https://www.acmicpc.net/problem/5904 5904번: Moo 게임 Moo는 술자리에서 즐겁게 할 수 있는 게임이다. 이 게임은 Moo수열을 각 사람이 하나씩 순서대로 외치면 되는 게임이다. Moo 수열은 길이가 무한대이며, 다음과 같이 생겼다. m o o m o o o m o o m o o o www.acmicpc.net 다루는 주제: 분할정복 # n 에서 전차수를 뺄때 1이면 n return은 m이다 나머진 전부 o # 새로운 차수 = S(k-1) + oxk+m + S(k-1) 새로운차수 길이 = 전차수 + 3 + 전차수 # n이 l보다 크고 다음 차수로 가는 필요길이보다 작을때만 # +++ l다음 글자는 무조건 m이다 import sys def moo(n, k, l..
문제링크:https://www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net 다루는 주제: 이분 탐색 import sys def binary(arr, start, end): result = 0 while start middle: # 나무길이가 중간값보다 크면 total += tree - middle # 나무길이 - 중간값 즉 가져갈 나무길이를 total에 저장 if total < M: # 가져갈 나무길이의 총합이 M에 미치지..
문제링크:https://www.acmicpc.net/problem/11279 11279번: 최대 힙 첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0 www.acmicpc.net 다루는 주제: 우선순위 큐 import heapq import sys N = int(sys.stdin.readline()) heap = [] for _ in range(N): x = int(sys.stdin.readline().strip()) if x == 0: if len(heap) == 0: print(0) else: print(-1 * heapq.heappop..
문제링크:https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 www.acmicpc.net 다루는 주제: 스택 import sys # 탑의 수 N = int(sys.stdin.readline()) # 탑의 높이 tops = [0] + list(map(int, sys.stdin.readline().split())) result = [0] * (N + 1) stack = [] for i in range(1, N + 1): # Stack에 탑의 정보가 남아있다면 while stac..
1주차를 마무리했다. 1주일간 알고리즘 첫 주 파이썬 문법에 익숙해질 수 있는 기초 문제들과 수학, 재귀, 정렬, 완전 탐색순으로 이어지는 40개 가량의 문제를 풀었던거 같은데 미니 프로젝트로 몰입 환경을 경험한 뒤라 그런 건지 1주 차라 문제가 쉬워서 그런 건지 그렇게 싫어했던 백준 문제에 재미가 붙는게 느껴진다. 이왕 시작한거 그동안 등한시하고 기술면접의 광탈 원인이었던 (Q: 퀵소트가 뭔지 알아요?? A: 빠른거요..) 알고리즘과 자료구조를 다시 한번 차근차근 공부할 수 있는 기회를 놓치고 싶지 않다. 이번주 키워드 재귀 호출 - 재귀 호출이란 함수 내부에서 함수 자기자신을 또 호출 하는거, 반드시 호출을 종료할 조건문이 필요하다(중요**) 시간 복잡도 - 특정한 크기의 입력에 대하여 알고리즘의 수..
문제링크:https://www.acmicpc.net/problem/10830 10830번: 행렬 제곱 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다. www.acmicpc.net 다루는 주제: 분할정복 import sys N, B = map(int, sys.stdin.readline().split()) # N*N행렬 입력 , B만큼 제곱 A = [list(map(int, sys.stdin.readline().split())) for _ in range(N)] # 행렬 받기 # NxN 행렬 곱셈 함수 def multiplication(n, a, b): result = [[0] *..
문제링크:https://www.acmicpc.net/problem/6549 6549번: 히스토그램에서 가장 큰 직사각형 입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 ≤ n ≤ 100,000) 그 다음 n개의 정수 h1, ..., hn (0 ≤ hi ≤ www.acmicpc.net 다루는 주제: 분할정복 import sys def histo(arr, start, end): if start == end: return arr[start] else: mid = (start + end) // 2 width = 2 # 너비 left = mid # 경계 왼쪽 right = mid + 1 # 경계 오른쪽 min_heigh..