본문 바로가기

분류 전체보기

(61)
[백준] 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번째 기계 왼쪽의 기계..
[백준] 2042 구간 합 구하기, python https://www.acmicpc.net/problem/2042 [백준] 2357 최솟값과 최댓값 [백준] 2357 최솟값과 최댓값https://www.acmicpc.net/problem/2357 세그먼트 트리, python 세그먼트 트리, python세그먼트 트리란? 세그먼트 트리란 완전 이진 트리에 배열의 구간 정보(최대, 최솟값, 합, 곱 등)를 저장하고 빠르게 구간 쿼aiden0413.tistory.com 구간합을 계산할 때는 합 세그먼트 트리를 생성한 다음, 이전에 풀었던 최솟값 최댓값 구하는 로직과 똑같이 왼쪽 자식 노드가 홀수일 경우 해당 노드값을 합에 반영시키고 노드번호를 1 증가시키고,오른쪽 자식 노드가 짝수일 경우 해당 노드값을 합에 반영시키고 노드번호를 1 감소시킨다.그..
[백준] 2357 최솟값과 최댓값, python https://www.acmicpc.net/problem/2357 세그먼트 트리, python 세그먼트 트리, python세그먼트 트리란? 세그먼트 트리란 완전 이진 트리에 배열의 구간 정보(최대, 최솟값, 합, 곱 등)를 저장하고 빠르게 구간 쿼리를 처리할 수 있는 자료구조이다.완전 이진트리란 리프노드를 제외aiden0413.tistory.com 특정 구간 (a, b) 사이의 최댓값, 최솟값을 m 번 구하는 문제이다.파이썬의 min, max는 시간복잡도가 O(n) 이므로 모든 (a, b) 부분배열에서 min, max 함수를 사용하게 되면 O(n²) 이 되어 시간초과가 나게 된다. 따라서 이 문제는 세그먼트 트리를 이용하여 풀어야 한다.세그먼트 트리란 완전 이진트리에 구간별로 나누어 그 구간 ..
[백준] 1194 달이 차오른다, 가자. , python https://www.acmicpc.net/problem/1194 키를 보유하고 있다면 문을 열고 탐색하고, 키를 보유하고 있지 않다면 키가 있는 곳에 들렀다가 키를 가지고 문을 열고 탐색하여 목적지까지의 최단 경로를 찾는 문제이다. 처음에는 최단경로를 찾는 문제이므로 bfs탐색을 해 목적지인 '1'까지의 경로를 모두 구하고, 도중에 열쇠를 보유하지 않은 문이 있다면 그 문에 해당하는 열쇠까지의 경로를 재귀적으로 구하는 방식으로 풀려했었는데 오답이 나왔다. 이 문제는 비트마스킹을 사용해서 현재 보유한 키정보를 업데이트하면서 bfs탐색을 하는 문제이다.a~f까지의 키 정보를 a부터 0번째, b는 1번째, c는 2번째 비트에 키를 보유하고 있다면 1, 보유하고 있지 않다면 0으로 표시한다.예를 들어 ..
[백준] 11003 최솟값 찾기, python https://www.acmicpc.net/problem/11003 구간의 최솟값을 찾는 문제이다.파이썬 내장함수 min을 쓰게 되면 O(n)을 n 번하게 되어 시간초과가 나게 된다. 이 문제는 모노토닉 큐를 사용하여 해결할 수 있다.모노토닉 큐(단조 큐)란 큐안의 원소들이 항상 오름차순, 또는 내림차순을 유지하도록 관리되는 큐이다.이 문제에서는 최솟값을 찾아야 하므로 큐가 오름차순을 유지되도록 관리한다. 모노토닉 큐에는 인덱스와 값을 같이 넣어주어야 한다. 왜냐하면 윈도우의 크기가 범위를 벗어나게 되면, 큐의 맨 왼쪽값(구간의 최솟값)이 범위를 벗어나게 되면 제외해 주어야하기 때문이다.윈도우를 오른쪽으로 이동시키고 윈도우에 추가되는 값과 모노토닉 큐의 맨 오른쪽값을 비교한다. 만약 추가되는 값이 더..
[백준] 1365 꼬인 전깃줄, python https://www.acmicpc.net/problem/1365 전깃줄이 꼬이지 않기 위해선 오름차순 순서대로 연결해야 한다.입력된 케이스에서 가장 긴 증가하는 부분 수열을 구하고 그 외의 전깃줄을 잘라내면 된다. LIS(가장 긴 증가하는 부분 수열), python LIS(가장 긴 증가하는 부분 수열), python가장 긴 증가하는 부분 수열이란? 가장 긴 증가하는 부분 수열, LIS(Longest Increasing Subsequence) 란 오름차순으로 정렬된 부분 수열 중에 가장 긴 것을 말한다. 예를 들면 수열이 [10, 20, 5, 30, 15, 50]에서aiden0413.tistory.com import sysfrom bisect import bisect_leftinput =..