본문 바로가기

python

(50)
[백준] 17136 색종이 붙이기, python https://www.acmicpc.net/problem/17136 좌측상단에서 처음 1이 나오는 위치를 찾는다. 그리고 그 위치부터 크기가 5인 색종이부터 붙인다. 한 종류의 색종이의 개수가 5를 넘거나 더 이상 붙일 수 없으면 색종이의 크기를 1 줄여서 탐색한다. 이 경우 항상 최소개수를 만족하게 된다. import sysimport copyinput = sys.stdin.readlineboard = [list(map(int, input().split())) for _ in range(10)]answer = float('inf')cnt = [0]*5# 좌측상단에서 처음으로 1이 나오는 위치def findPos(): for x in range(10): for y in range(..
[백준] 17135 캐슬 디펜스, python https://www.acmicpc.net/problem/17135 이 문제는 2단계로 진행된다. 첫 번째는 궁수가 적을 공격하는 단계, 두 번째는 적이 한 칸 이동하는 단계다.첫 번째로 궁수가 적을 공격하는 단계는 궁수를 배치할 수 있는 경우를 combinations를 사용해 구하고, 각 comb 케이스별로 궁수의 위치에서 bfs를 통해 거리가 d이하고, 가장 왼쪽에 있는 적의 위치를 저장한다. 저장한 적의 위치는 제거되므로 0으로 바꾼다.두 번째 단계는 적이 앞으로 1칸 이동하고, 성벽에 닿으면 제거되는 단계이다. 인덱스를 1씩 늘리면 된다.이 두 단계를 모든 적이 없을 때까지 반복하면 된다. import sysfrom itertools import combinationsfrom collection..
[백준] 17070 파이프 옮기기 1, python https://www.acmicpc.net/problem/17070처음에는 백트래킹으로 해결하려 했다가 시간초과가 났다. → 다음에는 →, ↘↓ 다음에는 ↓, ↘ ↘ 다음에는 →, ↘, ↓ 로 옮길 수 있다.반대로→이전에는 →, ↘ ↓ 이전에는 ↓, ↘↘ 이전에는 →, ↘, ↓ 만 가능하다. →를 0, ↓를 1, ↘를 2라고 하고 dp [i][j]를 파이프의 오른쪽 끝의 위치가 i, j일 때 옮길 수 있는 경우의 수라고 하면 dp [i][j][현재방향] = sum(dp [현재방향에 따른 이전 파이프 위치][ 현재방향에 따른 이전 파이프 위치 ][이전방향]) 가 된다. 따라서 현재방향에 따라 3가지 경우로 나눈뒤에 dp를 갱신해 주면 된다. import syssys.setrecursion..
[백준] 14003 가장 긴 증가하는 부분 수열 5, python https://www.acmicpc.net/problem/14003 [백준] 12738 가장 긴 증가하는 부분 수열 3 [백준] 12738 가장 긴 증가하는 부분 수열 3https://www.acmicpc.net/problem/12738LIS (Longest Increasing Subsequence)를 구하는 문제이다. n이 크기에 O(n²) 로 풀면 시간초과가 나온다.수열을 저장할 배열을 만든다. 수열에서 하나씩 탐색하며 배열이 비어있aiden0413.tistory.com 이전에 풀었던 가장 긴 증가하는 부분 수열 3을 확장한 문제이다.이전 LIS문제에서는 LIS의 길이만 구하는 거였다면, 이번에는 그 수열이 뭔지를 구해야 하는 문제이다.bisect_left를 통해 LIS배열을 갱신하는 부분은 ..
[백준] 13904 과제, python https://www.acmicpc.net/problem/13904 처음에는 백트래킹과 dp를 사용해서 해결하려 했는데 시간초과가 났다.힙을 사용해서 간단하게 풀수 있는 문제였다.최소힙에 과제 점수를 넣고, 힙의 길이가 마감까지 남은 일수보다 클 경우 최솟값을 제거한다.최종적으로 마지막까지 힙에 남은 값들을 더해주면 된다.마감일까지 남은 일수(d)과제점수(w)최댓값이 되게 선택 하는 경우 설명120201일차에는 1개까지 가능하므로 20 추가25020, 50마찬가지로 50 추가33020, 30, 5030 추가41010, 20, 30, 5010 추가44020, 30, 40, 504개까지 밖에 수행할수 없으므로 가장작은 10을 빼고 40을 추가46030, 40, 50, 60마찬가지로 20을 빼고 60을 추가6..
[백준] 12738 가장 긴 증가하는 부분 수열 3, python https://www.acmicpc.net/problem/12738 LIS(가장 긴 증가하는 부분 수열), python LIS(가장 긴 증가하는 부분 수열), python가장 긴 증가하는 부분 수열이란? 가장 긴 증가하는 부분 수열, LIS(Longest Increasing Subsequence) 란 오름차순으로 정렬된 부분 수열 중에 가장 긴 것을 말한다. 예를 들면 수열이 [10, 20, 5, 30, 15, 50]에서aiden0413.tistory.com LIS (Longest Increasing Subsequence)를 구하는 문제이다. n이 크기에 O(n²)로 풀면 시간초과가 나온다.수열을 저장할 배열을 만든다. 수열에서 하나씩 탐색하며 배열이 비어있거나, 넣으려는 수열의 값이 배열의 마지막..
[백준] 10775 공항, python https://www.acmicpc.net/problem/10775 i 번째 게이트에 비행기가 들어가면 'i번째 게이트 이하의 게이트 중에서 열린 게이트의 최대 번호'를 prev배열에 저장하고, find함수를 통해 경로 압축을 하였다.find함수는 현재게이트 이전의 열린 게이트의 번호를 추적해 나가면서 prev 값을 경신시켜 준다. 유니온 파인드 알고리즘, python 유니온 파인드 알고리즘, python유니온 파인드 알고리즘이랑, 두 집합을 하나로 합치고(union) 두 원소가 같은 집합에 속해있는지 확인하는(find) 알고리즘이다. 유니온 파인드를 구현하기 위해서는 부모노드의 번호를 저장할 rootaiden0413.tistory.com 유니온 파인드의 find함수와 동작 방식이 같다. 예..
[백준] 2211 네트워크 복구, python https://www.acmicpc.net/problem/2211 처음에는 유니온 파인드로 간선들을 최소비용 순으로 정렬하고 비용이 적은 간선들을 추가해 나가면서 모든 노드들이 연결되면 최소 비용이다라고 풀었는데 틀렸다.틀렸던 이유는 유니온파인드를 사용해서 풀었던 방식은 최소 신장트리(그래프 간선들의 합이 최소)를 구하는 크루스컬 알고리즘 이었기 때문이었다.이 문제는 최소 경로 트리(한점에서 다른 노드들까지의 최단 경로)를 구하는 다익스트라를 사용해서 풀어야 되는 문제이다.다익스트라 알고리즘은 파이썬의 heapq를 사용해서 구현하였다. 다익스트라 알고리즘(최단경로 알고리즘), python 다익스트라 알고리즘(최단경로 알고리즘), python그래프의 어떤 한 정점에서 출발하여 다른 정점까지 갈수있는 가..