PS/백준 130

[Python] 15686번 치킨 배달

✏️ 문제 문제 파악빈 칸 중 m에 치킨집을 세울 수 있으므로 combinations을 사용해야 한다.for .. in combinations(가능한 위치 배열, 개수) 그리고 치킨 거리의 최솟값이 필요하므로 min을 사용해 코드를 짰다.  알고리즘구현브루트포스 알고리즘백트래킹 코드import sysfrom itertools import combinationsinput = sys.stdin.readlinen, m = map(int, input().split())graph = list(list(map(int, input().split())) for _ in range(n))result = 999999house = [] chickens = [] for i in range(n): for j i..

PS/백준 2024.10.30

[Python] 14502번 연구소

✏️ 문제 문제 파악바이러스가 벽을 제외하고 네 방향으로 퍼질 수 있으므로 bfs를 사용했다. 그리고 비어있는 영역 중에 3개의 영역에 벽을 세울 수 있으므로 combinations을 사용해야 한다.for .. in combinations(가능한 위치 배열, 개수) 벽을 세운 후에 남아있는 영역 중 안전 영역의 개수를 구해야 하므로 dfs를 돈 결과가 필요하다.그래서 연구소 배열을 deepcopy를 통해 여러 개의 연구소 배열을 만들고 여러 연구소 배열의 안전 영역의 개수 중 제일 많은 영역을 출력하도록 max를 사용해 코드를 짰다.  알고리즘구현그래프 이론브루트포스 알고리즘그래프 탐색너비 우선 탐색 코드import sysimport copyfrom collections import dequefrom i..

PS/백준 2024.10.30

[Python] 1966번 프린터 큐

✏️ 문제 문제 파악같은 중요도가 없다면 쉽게 풀 수 있는데 중요도가 같은 값들이 있어서 시간이 걸렸던.. 문제이다.덱에 넣을 때부터 아예 (중요도, 인덱스)로 키 값도 같이 넣어서 키 값을 기준으로 구하는 값이 맞는 지 확인하도록 했다. 그리고 max 값을 구할 때 처음에 max(q[0]) 으로 했는데 알고보니 max(q)[0] 이런 식으로 구하는 거 였다... 알고리즘구현자료 구조시뮬레이션큐 코드from collections import dequefor _ in range(int(input())): n, m = map(int, input().split()) ary = list(map(int, input().split())) order = 0 q = deque([]) for i in ra..

PS/백준 2024.10.30

[Python] 2193번 이친수

✏️ 문제 문제 파악n이 1, 2, 3, 4, 5일 때 각각 dp[n]의 값을 구하면 쉽게 점화식을 구할 수 있다. 그림을 그려보면 다음과 같다.num 배열은 dp 배열 앞뒤 값의 차이를 담은 배열이다.그림을 보면 다음과 같은 점화식이 나오는 것을 알 수 있다.num[n] = dp[n-1]dp[n] = dp[n-1] + num[n-1] 나중에 보니 dp 배열 자체가 피보나치 수열와 같았음... = 이 말은 즉 num 배열 필요 X..  알고리즘다이나믹 프로그래밍  코드n = int(input())num = [0, 1, 1]dp = [1, 1, 2]for i in range(3, n): num.append(dp[i-1]) dp.append(dp[i-1] + num[i-1])print(dp[n-1])

PS/백준 2024.09.15

[Python] 1904번 01타일, 자세한 설명, 그림 참조

✏️ 문제 문제 파악n이 1, 2, 3, 4일 때 각각 dp[n]의 값을 구하면 쉽게 점화식을 구할 수 있다. 그림을 그려보면 다음과 같다.하지만 이 문제는 메모리가 적고 시간이 매우 짧다는 점..!고민해보니 3개짜리 배열만 사용하면 되는 거 같아서 인덱스로 들어올 값을 %3 해 인덱스로 써서 풀었다. 그리고 이 문제는 답에 15746으로 나눈 값을 구하고 있다.처음엔 마지막 print에서 % 15746 했었는데 시간 초과가 떠서 애초에 배열에 값을 넣을 때 % 15746을 하니 풀렸다!  알고리즘다이나믹 프로그래밍  코드n = int(input())dp = [1, 2, 3]for i in range(3, n+1): dp[(i-1) % 3] = (dp[i % 3] + dp[(i+1) % 3]) % 1..

PS/백준 2024.09.15

[Python] 11660번 구간 합 구하기 5, 그림 참조

✏️ 문제문제 파악dp 배열을 주어진 배열의 누적 합을 담는 배열로 정의한 후 각 배열에 대해 그림으로 작성하면 다음과 같이 나온다.코드에 대해서 너무 헷갈려서 IndexError가 계속 났다..ary 배열은 0부터, dp 배열은 1부터 시작하는 것을 잊지 말자... 두 개가 각각 index 0, 1부터 시작하지 않으면 코드가 매~우 길어져요...  알고리즘다이나믹 프로그래밍 누적 합 코드시간 초과 코드처음엔 그냥 단순하게 풀어봤지만 틀렸다. 당연함. 실버 1문제임.n, m = map(int, input().split())ary = [list(map(int, input().split())) for _ in range(n)]for _ in range(m): x1, y1, x2, y2 = map(int, ..

PS/백준 2024.09.15

[Python] 14501번 퇴사, 그림 설명, 자세한 설명

✏️ 문제 문제 파악처음에는 시작점을 기준으로 잡아서 풀려고 했는데 경우의 수가 너무 많았다...!  뭔가 2156번 포도주 문제랑 2579번 계단 오르기 문제랑 비슷할 것 같아서 시간을 좀 썼는데 결국 못풀었다 ㅠ.. 아쉽 이 문제의 포인트는 시작점이 아닌 "끝점"을 기준으로 푸는 것이 포인트이다!끝점부터 시작점까지 내려오는데 해당 위치에 있을 때 n일 때 상담한다.n일 때 상담하지 않는다.이 두 가지 경우로 나누어서 둘 중에 더 큰 값을 dp[n]에 대입해야 한다.n일 때 상담하지 않는 경우를 왜 고려하냐면 n일 때 상담하지 않고 n-1일 때 상담했을 때 (n-1일 때 t[n-1]이 2 이상일 경우) 더 이득일 경우도 있기 때문이다.무조건 n일 때 꼭 상담하라는 말이 없기 때문이다.그림으로 작성하면 ..

PS/백준 2024.09.14

[Python] 2156번 포도주 시식, 그림 설명, 자세한 설명, 완벽 분석

✏️ 문제 문제 파악2579번 계단 오르기 와 유사한 문제이다!저 문제와의 차이점은 계단 오르기는 꼭 마지막 계단을 밟아야 하는데 이 문제는 꼭 마셔야 하는 포도주가 없다는 것이다. 그러면 경우의 수를 나누면 다음과 같이 나온다.n번째 포도주를 마신다.n-2번째 포도주를 마셨다.n-3번째 포도주와 n-1번째 포도주를 마셨다.n번째 포도주를 마시지 않는다.n-2번째 포도주와 n-1번째 포도주를 마셨다.나는 다른 풀이들이 다 해당 포도주를 마시지 않는다는 조건을 두길래 왜 최대를 구하는데 마시지 않는 조건을 고려하는 거지? 라고 생각했는데 이유를 생각해보니 다음과 같았다. 해당 포도주를 마시지 않는다는 조건을 두는 이유는n번째 포도주를 마시지 않고 n-2번째 포도주와 n-1번째 포도주를 마셨을 때 최대일..

PS/백준 2024.09.14

[Python] 1912번 연속합

✏️ 문제 문제 파악처음에 이중 반복문 써서 풀고 있다가.. 시간 초과나서 찾아보니 최대 부분합을 푸는 방법 중 카데인 알고리즘을 써야 풀리는 문제였다.간단하게 설명하자면 시작 원소를 기준으로 부분 배열을 구하는 게 아니라 끝 원소를 기준으로 모든 부분 배열을 구하는 알고리즘이다.   알고리즘다이나믹 프로그래밍   코드시간 초과 코드import sysinput = sys.stdin.readlinen = int(input())ary = list(map(int, input().split())) value = -1000for i in range(n): temp = ary[i] for j in range(i+1, n): value = max(value, temp) temp += ary[j]pri..

PS/백준 2024.09.13