본문 바로가기

분류 전체보기

(147)
Baekjoon 6549. 히스토그램에서 가장 큰 정사각형 / Python 6549. 히스토그램에서 가장 큰 정사각난이도 : 플래티넘 5소요 시간 : 35분날짜 : 2025.01.05언어 : 파이썬알고리즘 유형 : 분할정복, 세그머트트리, 스택설명 보기전에 문제 풀어보러 가기1. 문제 설명히스토그램의 내부의 직사각형들 중 가장 넓이가 큰 직사각형을 구하기2. 해결 방식스택 활용히스토그램을 순회하면서 현재 높이보다 낮은 높이를 만날 때마다 직사각형 넓이를 계산한다.0을 만난다면 스택을 초기화한다.시간복잡도 : O(n)세그먼트트리각 구간의 최소 높이를 세그먼트 트리로 저장한다.구간의 최소높이 * 구간의 크기 = 넓이전체 시간복잡도: O(nlongn)분할정복(사용하지 않았지만, 가능한 방법)(히스토그램에서 가장 낮은 높이를 기준으로 좌우로 분할)을 반복하는 방식시간 복잡도 : O(n..
Baekjoon 2156. 포도주 시식 / Python 2156. 포도주 시식난이도 : 실버 1소요 시간 : 15분날짜 : 2025.01.05언어 : 파이알고리즘 유형 : dp설명 보기전에 문제 풀어보러 가기1. 문제 설명포도주를 선택하면 모두 마셔야 하고, 제자리에 놓아야 한다.연속으로 3잔을 마실 수 없다.마실 수 있는 포도주 양의 최댓값을 구하기2. 해결 방식dp 사용 : dp[i][j] = i번 포도주를 j잔째 마시고 있는 경우 포도주양의 최댓값.0잔, 즉 i번 포도주를 안먹는다면, dp[i-1]의 값들 중 최댓값이 dp값이다.i번 포도주가 연속된 첫번째 잔이라면, dp[i-1][0]의 값과 dp[i-2]값들 중 최댓값에 현재 포도주 양을 더한 값이 dp 값이다.두번째 잔인 경우, dp[i -1][1]의 값에 현재 포도주 양을 더해주면 된다.3. 정답..
Baekjoon 32034. 동전 쌍 뒤집기 / Python 32034. 동전 쌍 뒤집기난이도 : 플래티넘 5소요 시간 : 25분날짜 : 2025.01.02언어 : 파이썬알고리즘 유형 : 스택, 그리디설명 보기전에 문제 풀어보러 가기1. 문제 설명N개의 동전이 일렬로 놓여있다.조작을 원하는대로 할 수 있다.서로 이웃하고, 같은 면인, 두 개의 동전을 둘 다 뒤집기모든 동전이 앞면이 보이게 할 수 있는가? 가능하다면 최소 조작횟수를 구하라.2. 해결 방식자료구조 : 스택을 활용한다.먼저 뒷면의 위치를 저장하고 개수를 센다.뒷면의 개수가 2로 나누어지지 않으면 불가능, 0이면 답이 0뒷면인 동전들을 돌면서 스택을 활용한다.스택이 비어있다면 스택에 넣기스택의 마지막 요소와 현재 요소의 인덱스 차이가 짝수라면, 가운데의 앞면을 다 뒤집고 다시 뒷면으로 다 뒤집으면 모두 ..
Bakejoon 17471. 게리맨더링 / Python 17471. 게리맨더링난이도 : 골드 3소요 시간 : 20분날짜 : 2024.01.02언어 : 파이썬알고리즘 유형 : 그래프이론, bfs, dfs, 조합설명 보기전에 문제 풀어보러 가기1. 문제 설명각각의 인구가 있는 구역이 있음.구역을 두 선거구로 나누어야 함.같은 선거구에 속한 구역은 항상 연결되어있어야 함.한 선거구에는 최소 1개 이상의 구역이 있어야 함.각 선거구의 인구의 차이를 최소로 하기2. 해결 방식구역의 개수가 최대 10밖에 안되어서 그냥 완전탐색을 하기로 했다.가능한 모든 선거구의 조합을 구해서 확인한다.먼저 선거구가 연결되어있는지 확인 : 기본적인 bfs로 해결연결되어있다면 최소값 갱신3. 정답 코드import sys;input = sys.stdin.readlinefrom itertoo..
Baekjoon 23250. 하노이 탑 K / Python 23250. 하노이 탑 K난이도 : 골드 4소요 시간 : 30분날짜 : 2025.01.02언어 : 파이썬알고리즘 유형 : 재귀, 이분탐색설명 보기전에 문제 풀어보러 가기1. 문제 설명n개의 원판이 있는 하노이탑에서 k 번째 이동을 구하시오2. 해결 방식이분탐색 + 재귀일반적인 하노이 탑의 재귀함수를 사용한다.바뀌는 점전체경로를 구하는게 아니므로, 하노이탑 전체 크기를 계속 하나씩 줄여나갈 수 있다.만약 중앙을 옮기는 경우라면 바로 출력하면 되고,중앙 이후의 경우라면, k값을 갱신해주면서 재귀함수를 돌리면 된다.3. 정답 코드n, k = map(int, input().split())def hanoi(x:int=n, now:int=k, a:int=1, b:int=3, c:int=2): if x == 1..
Baekjoon 1038. 감소하는 수 / Python 1038. 감소하는 수난이도 : 골드 5소요 시간 : 20분날짜 : 2025.01.02언어 : 파이썬알고리즘 유형 : 완전탐색, 백트래설명 보기전에 문제 풀어보러 가기1. 문제 설명음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다.n번째 감소하는 수를 출력하라 없다면 -1을 출력하라.2. 해결 방식감소하는 수를 다 구해놓고, 출력한다.감소하는 수 구하기9876543210 에서 완전탐색으로 하나씩 빼면서 집합에 집어넣는다.그 후 정렬한다.3. 정답 코드import sys# input = sys.stdin.readlinesys.stdin = open("C:/Users/ghtjd/Desktop/tmp/python/input.txt", "r")sys.s..
Baekjoon 2042. 구간 합 구하기 / Python 2042. 구간 합 구하기난이도 : 골드 1소요 시간 : 40분날짜 : 2025.01.01언어 : 파이썬알고리즘 유형 : 세그먼트 트리설명 보기전에 문제 풀어보러 가기1. 문제 설명숫자배열이 주어진다.커맨드들이 두 종류로 주어진다.a가 1이면 b번째 숫자를 c로 바꾼다.a가 2이면 b 부터 c까지의 합을 출력한다.2. 해결 방식우선 주어진 숫자 배열에 맞게 세그먼트 트리를 만들어준다.누적 합 : 세그먼트 트리의 누적 합 구하는 알고리즘을 사용숫자 변경 : 자식 노드를 찾아 들어가면서, 변경할 인덱스가 나오면 숫자를 바꾸어 준다.이 때, 재귀함수(자식노드를 찾는)가 종료되면 그 부모 노드에서의 세그트리의 값을 갱신해주어야 한다.3. 정답 코드import sys; input = sys.stdin.readli..
Baekjoon 1019. 책 페이지 / Python 1019. 책 페이지난이도 : 플래티넘 5소요 시간 : 20분날짜 : 2024.12.31언어 : 파이썬알고리즘 유형 : 구현, 수학설명 보기전에 문제 풀어보러 가기1. 문제 설명1부터 n까지 [0, 1 ,2, ,,, 9]가 각각 몇 번 나오는지 구하기1 2. 해결 방식자리수 별로 반복하기. (최대 9번)factor = 1 ($10^0$)부터 시작해서 10씩 곱해가며 반복한다.현재 자리를 기준으로, 현재자리 숫자와 더 높은 자리 숫자, 더 낮은 자리 숫자로 구분한다.0부터 9까지 확인하여 결과값에 더해준다.현재자리수보다 작은 수 : (높은자리 숫자 + 1) * factor를 더 해준다.현재자리 수 : 높은자리 숫자 * factor + 낮은자리 숫자 + 1을 더 해준다.현재자리 수보다 큰 수 : 높은자리 숫..
Baekjoon 2263. 트리의 순회 / Python 2263. 트리의 순회난이도 : 골드 1소요 시간 : 10분날짜 : 2024.12.30언어 : 파이썬알고리즘 유형 : 재귀, 트리, 분할 정복설명 보기전에 문제 풀어보러 가기1. 문제 설명트리의 크기 n이 주어짐중위순회(inorder)와 후위순회(postorder)가 주어짐전위순회(preorder)결과를 구하기.2. 해결 방식중위순회는 왼쪽부터 하위트리를 우선으로 트리를 방문 후 루트를 방문하는 방식후위순회는 왼쪽부터 "하위트리를 모두 방문한 후" 루트를 방문하는 방식전위순회는 루트노드부터 시작하여 왼쪽 자식먼저 방문하는 방식재귀함수의 원리 및 사용후위순회의 마지막 요소는 현재 서브트리의 루트 노드이다.중위순회에서의 루트를 기준으로 왼쪽, 오른쪽으로 서브트리를 나눈다.루트 노드를 출력한다.(전위순회)3...
Baekjoon 12850. 본대 산책 2 / Python 12850. 본대 산책 2난이도 : 골드 1소요 시간 : 15분날짜 : 2024.12.29언어 : 파이썬알고리즘 유형 : 행렬, 그래프, 분할 정복설명 보기전에 문제 풀어보러 가기1. 문제 설명그래프가 주어진다. 만들어야 한다. 귀찮다....d분동안 산책한다.정보과학관을 돌아오는 경로의 경우의 수를 구한다.2. 해결 방식행렬에 대한 이해를 필요로 하는 문제이다.i분 산책한 경로 배열 * j분 산책한 경로 배열 을 하면 i+j분 산책을 한 경로를 구할 수 있다.이를 활용하면 시간복잡도를 log2(d)로 해결가능.3. 정답 코드# 숭실대 지도 그리기arr = [[0] * 8 for _ in range(8)]arr[0][1], arr[1][0] = 1, 1arr[0][2], arr[2][0] = 1, 1arr..