본문 바로가기

python

(50)
[백준] 1707 이분 그래프, python https://www.acmicpc.net/problem/1707 이분 그래프(bipartite graph), python 이분 그래프(bipartite graph), python이분 그래프란? 이분 그래프란 그래프의 정점들을 2개의 집합으로 나누었을 때 각 집합 내의 정점들 간에 서로 연결된 간선이 없도록 분리할 수 있는 그래프를 말한다. 위 그래프에서 집합1 = [1,aiden0413.tistory.com 예제 입력에서 첫번째 케이스의 경우 모든 정점을 색칠할 수 있다. 따라서 이분 그래프이다. 예제 입력의 두번째 케이스는 3번과 4번 정점이 같은색으로 칠해진다. 이분 그래프가 아니다. import sysfrom collections import defaultdict,dequ..
파이썬 함수 결과값 자동 캐싱(cache, lru_cache), python 파이썬 functools에는 cache와 lru_cache이 있다.둘 다 함수의 결과값을 자동으로 캐싱해 주는 기능이다. lru_cache(Least Recently Used)는 최근에 가장 적게 사용된 캐시를 삭제한다.또한 maxsize로 캐시 용량을 제한할 수 있다. maxsize를 미리 예측해야 된다는 단점이 있다. cache는 삭제가 없고 무제한으로 캐싱을 한다.따라서 메모리 사용량이 많아질 수 있다.LRU관리를 하지 않기 때문에 속도 측면에서 lru_cache보다 약간 빠르다고 한다. 이 기능을 쓰면 dp배열을 만들지 않고도 재귀 함수만으로 dp와 같은 기능을 구현할 수 있다.사용방법은 간단하다. cache를 import 하고, @cache를 캐싱할 함수 위에 선언해 주면 된다. n을 입력..
[백준] 2696 중앙값 구하기, python https://www.acmicpc.net/problem/2696 수열의 홀수번째 인덱스에서, 해당인덱스까지의 중앙값을 구하는 문제이다. 수를 차례대로 입력받으면서 입력받는 즉시 insort_left를 통해 배열에 넣어준다.insort_left는 정렬을 유지하면서 배열에 넣을 수 있는 함수로, 이진탐색을 통해 x보다 크거나 같은 수의 첫 번째 위치에 삽입해 준다.insort_left를 통해 삽입하면 배열의 정렬 상태가 유지되므로 배열의 중앙 인덱스에 있는 값이 현재까지 입력받은 수의 중앙값이 된다. import sysfrom bisect import insort_leftinput = sys.stdin.readlinet = int(input())answer = []for _ in range..
[백준] 25682 체스판 다시 칠하기 2, python https://www.acmicpc.net/problem/25682 n*m크기의 체스판을 k*k크기로 나누었을 때 각 칸을 체스판 형태로 만들려고 한다. 이때 색을 칠하는 횟수의 최솟값을 구하는 문제이다. dp [i][j][0]를 i, j 번째 칸을 W일 때 칠한 횟수의 최솟값,dp [i][j][1]을 i, j번째 칸이 B일 때 칠한 횟수의 최솟값이라고 한다. dp [i번째][j번째][해당칸의 색깔(W면 0, B면 1)] = dp [i번째][j-1번째][해당칸의 색깔과 반대색] + dp [i-1번째][j번째][해당칸의 색깔과 반대색] - dp [i-1번째][j-1번째][해당칸의 색깔과 같은 색] + 기존 색과 같으면 1 아니면 0을 해주면 된다. i, j 번째 칸이 W인 경우 현재 칸이 그대..
[백준] 13459 구슬 탈출, python https://www.acmicpc.net/problem/13459 구슬이 있는 판을 상, 하 , 좌, 우로 기울이면서 10턴안에 빨간 구슬이 구멍으로 빠져나올 수 있는지를 구하는 문제이다. 도중에 파란 구슬이 빠지게 되면 안 된다. 먼저 각 구슬을 해당 방향으로 기울였을 때 도달하는 좌표를 구하는 함수를 구현했다.이 함수는 현재좌표와 기울인 방향을 입력으로 받아 구슬의 다음 좌표와 끝나는 지점이 벽인지 구멍인지를 반환한다. 만약 오른쪽으로 기울였다면 오른쪽에 있는 구슬을 먼저 이동시킨다. 그다음 왼쪽에 있는 구슬을 이동시킨다.마찬가지로 왼쪽으로 기울였다면 왼쪽에 있는 구슬 먼저, 위쪽으로 기울였다면 위쪽에 있는 구슬 먼저 이동시킨다. 다음 좌표가 구멍이라면, 파란 구슬이 빠졌을 때는 탐..
[백준] 1207 종이 자르기, python https://www.acmicpc.net/problem/1207 5개의 종이 조각을 합쳐 l*l의 정사각형 모양을 만들 수 있다면 사전순으로 빠른 경우를 구하는 문제이다. 조각들의 #의 총 합이 l*l개가 아니라면 정사각형을 만드는 게 불가능하다. 다음으로 조각들의 크기가 큰 순으로 정렬한다.크기순으로 정렬하는 이유는 정사각형을 가득 채우기 위해서는 모든 조각이 전부 들어가야 하는데, 큰 조각부터 넣었을 경우 다음 조각을 놓을 수 있는 빈 공간이 가장 적이지기 때문이다. 조각을 배치할수 있는 공간을 valid함수를 통해 체크하고, 배치할 수 있다면 board의 칸을 해당 조각의 번호로 교체하고 다음 조각으로 넘어간다. 백트래킹으로 모든 조각의 경우를 탐색하며, 5번째 조각까지 전부 놓았을경..
[백준] 1517 버블 소트, python https://www.acmicpc.net/problem/1517 버블 소트로 정렬을 할 때, 수의 교체가 몇 번 일어나는지를 세는 문제이다.n*n의 모든 경우를 탐색하며 개수를 세어주면 시간초과가 난다.작은 값이 앞쪽에 와야하므로, 배열에서 현재 선택된 수의 오른쪽 부분에서 현재 수보다 작은 값이라면 교체를 해주어야 한다.예를 들어 배열이 [3,4,2,1]이라 하면, 먼저 배열의 요소를 크기순으로 정렬하여 작은 것부터 순서대로 0,1,2.. 에 매핑시켰다. 이렇게 되면 처음 배열 [2,3,1,0]에서 2는 1과 0, 3은 1과0, 1은 0과 교체해야 한다. 즉 배열에서 i번쨰 값을 k라 하면, i+1부터 배열의 끝까지 k보다 작은 요소의 개수를 세어주면 된다. [백준] 7578 공장 [백준..
[백준] 7578 공장, python https://www.acmicpc.net/problem/7578 두 기계를 서로 연결했을 때 교차점의 개수를 세는 문제이다. 먼저 b의 기계가 a의 몇번째 기계에 해당하는지 기계 식별번호를 인덱스로 변환해 준다. 선이 겹치는지를 확인하려면 현재 a에서 b로 연결한 기계 기준 왼쪽에 있는 기계의 인덱스 번호가 크다면 겹치게 된다.. 여기서 a의 1번째 기계와 연결된 기계는 b의 3번째 기계이다.그럼 b라인에서 3번째(a의 1번째 기계와 연결)보다 왼쪽에 있는 2번째(a의 4번째 기계와 연결), 1번째(a의 2번째 기계 와 연결) 기계에 연결된 번호가 더 크므로 2개의 선이 겹치게 된다. 마찬가지로 a의 3번째 기계는 b의 4번째 기계와 연결되어 있고,그럼 b에서 4번째 기계 왼쪽의 기계..