본문 바로가기

백준 문제풀이 코드저장소/Gold

(74)
Baekjoon 9997. 폰트 / Python 9997. 폰트난이도 : 골드 3소요 시간 : 30분날짜 : 2025.01.10언어 : 파이썬알고리즘 유형 : 비트마스킹, 완전탐색, 재설명 보기전에 문제 풀어보러 가기1. 문제 설명단어들이 주어진다.단어들을 조합해서 문장을 만든다.(중복X, 순서X)모든 알파벳이 포함되는 문장의 개수를 구한다.2. 해결 방식단어를 비트로 바꾸어 저장한다.목표 goal = (1 재귀함수 + 완전탐색 : sol(bit, idx)idx를 0부터 시작해서 하나씩 늘려가면서 확인한다.종료조건 1 : 현재 bit가 goal에 도달하면 남은 단어들의 모든 경우의 수 $2^(n - idx)$ 를 반환하고 종료종료조건 2 : idx가 n이 되면 0을 반환하고 종료재귀 : 현재 idx에 해당하는 단어를 넣는 함수 호출, 안넣는 함수 호출..
Baekjoon 1520. 내리막 길 / Python 1520. 내리막 길난이도 : 골드 3소요 시간 : 20분날짜 : 2025.01.09언어 : 파이썬알고리즘 유형 : dp, bfs설명 보기전에 문제 풀어보러 가기1. 문제 설명높이가 담겨있는 그래프가 주어진다.내리막길로만 이동해서 1,1부터 m,n까지 이동하는 경우의 수를 구하기2. 해결 방식dp[i][j] : i,j에서의 이동가능한 경우의 수거꾸로 탐색하여 dp값을 채운다.재귀함수 : sol(x,y)x,y : 현재 위치x,y가 -1이 아니면 방문한 경우이므로, 종료dp의 값을 0으로 초기화 시킨 후, 다음 방문 가능지역의 dp값을 더해준다.결과적으로 재귀함수의 특성때문에, 끝점부터 세는 구현방식이 된다.3. 정답 코드import sys;input=sys.stdin.readlinesys.setrecurs..
Baekjoon 2629. 양팔저울 / Python 2629. 양팔저울난이도 : 골드 3소요 시간 : 25분날짜 : 2025.01.09언어 : 파이썬알고리즘 유형 : dp, 배낭문제(napsack)설명 보기전에 문제 풀어보러 가기1. 문제 설명양팔저울이 있고, 가진 추의 무게들이 주어진다.무게를 확인할 구슬들이 주어진다.구슬의 무게를 확인가능한지 여부를 출력한다.2. 해결 방식dp[i][j] : i개의 구슬을 사용, j의 무게를 잴수 있는 지 여부dp의 크기 $x*y$ : x는 개수이므로 n$ + 1$, y는 무게이므로 구슬들의 최대 무게인 sum(weights)재귀함수 구현 sol(cnt, cost)cnt : 현재 구슬의 인덱스, 방문한 구슬의 개수를 나타내기도 한다.cost : 확인한 현재 무게종료조건 : cnt가 n 인 경우 종료, dp[cnt][c..
Baekjoon 2293. 동전 1 / Python 2293. 동전 1난이도 : 골드 4소요 시간 : 10분날짜 : 2025.01.09언어 : 파이썬알고리즘 유형 : dp설명 보기전에 문제 풀어보러 가기1. 문제 설명동전의 종류가 주어진다.적당히 조합해서(중복가능, 순서없음) k원을 만드는 가지수를 구한다.2. 해결 방식dp[i] = i원을 만드는 경우의 수점화식동전 c에 대해서 dp[i] += dp[i-c]이다.이 때, i는 c~k 사이여야 한다.3. 정답 코드import sys;input = sys.stdin.readlinen, k = map(int, input().split())dp = [1] + [0] * k # dp[i] : i원을 만드는 경우의 수for coin in [int(input()) for _ in range(n)]: for i..
Baekjoon 11066. 파일 합치기 / Python 11066. 파일 합치기난이도 : 골드 3소요 시간 : 30분날짜 : 2025.01.09언어 : 파이썬알고리즘 유형 : dp설명 보기전에 문제 풀어보러 가기1. 문제 설명파일 크기 배열이 주어진다.파일을 두 개씩 골라서 합칠 수 있다.두 파일은 합쳐지면 크기가 더해지며 하나가 되고, 합치는데에는 두 파일의 크기의 합이 비용으로 든다.최소 비용으로 파일을 하나로 합치기2. 해결 방식DP배열 : dp[i][j] = i부터 j까지 합치는데 필요한 최소 비용prefix_sum(누적합)을 이용해서 좀 더 효율적인 구현을 했다.점화식dp[i][i] 는 0이다.dp[i][i+1] 은 두 파일 크기의 합이다.dp[i][j] 는 i~j 사이에 어떤 수 p가 있다고 가정했을 때, p를 기준으로 왼쪽 오른쪽을 합치는 것들의..
Baekjoon 10986. 나머지 합 / Python 10986. 나머지 합난이도 : 골드 3소요 시간 : 10분날짜 : 2025.01.08언어 : 파이썬알고리즘 유형 : 누적 설명 보기전에 문제 풀어보러 가기1. 문제 설명숫자 배열이 주어진다.연속된 부분 구간의 합이 m으로 나누어 떨어지는 구간의 개수를 구한다.2. 해결 방식나머지의 개념두 수 A, B가 있다고 할 때, 두 수의 나머지를 a, b라고 하자.A + B의 나머지는 a + b의 나머지와 같고, A - B의 나머지는a - b의 나머지와 같다.구간 합구간 합을 따로 배열로 저장하지 않는다.0번부터 n-1번 배열을 순차적으로 돌아서 그 나머지를 x라고 했을 때, cnt[x] 에 하나씩 더해준다.결과값구간의 나머지 합을 구할 때, 나머지가 같은 구간들을 구해주면 된다. 예를 들어, 1 ~ 9가 나머지..
Baekjoon 1275. 커피숍2 / Python 1275. 커피숍2난이도 : 골드 1소요 시간 : 15분날짜 : 2025.01.08언어 : 파이썬알고리즘 유형 : 세그먼트 트리설명 보기전에 문제 풀어보러 가기1. 문제 설명정수배열이 주어진다.x, y, a, b의 쿼리가 주어진다.x~y의 합을 출력하고,a번째 수를 b로 바꾼다.2. 해결 방식세그먼트트리 자료구조의 기본적인 문제이다.세그먼트트리의 생성세그먼트 트리 누적 합 구하기세그먼트 트리 갱신3. 정답 코드import sys;input = sys.stdin.readlinedef make_seg(n, arr): seg = [0] * (4 * n) def make(node, s, e): if s == e: seg[node] = arr[s] r..
Baekjoon 25682. 체스판 다시 칠하기 2 / Python 25682. 체스판 다시 칠하기 2난이도 : 골드 4소요 시간 : 20분날짜 : 2025.01.06언어 : 파이썬알고리즘 유형 : 누적 합설명 보기전에 문제 풀어보러 가기1. 문제 설명아무렇게나 칠해져있는 n * m 의 판이 있음.체스판은 검은색, 흰색이 번갈아 칠해져야함.k * k를 잘라서 체스판으로 만드려고 함, 칠해야하는 최소 개수는?2. 해결 방식미리 완벽한 체스판을 만들어놓기, (두개 : 왼쪽상단이 검은색, 흰색)틀린개수의 누적합을 구하기현재의 틀린개수 = 왼쪽의 틀린개수 + 위쪽의 틀린개수 - 왼쪽 위의 틀린개수 + 현재칸의 틀린지 여부전체 돌면서 최솟값 확인하기3. 정답 코드import sysinput = sys.stdin.readlinen, m, k = map(int, input().spl..
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..