본문 바로가기

728x90
반응형

알고리즘/백준

(40)
[Python] 백준 18870번, 좌표 압축 1. 알고리즘 여기를 클릭하면 문제를 확인할 수 있다. 문제에 따르면 원본 데이터에서 중복되는 수를 없애고 숫자가 작은 순서대로 번호를 매겨 저장한 압축 데이터를 생성한다. 그런 다음에 원본 데이터의 값들을 압축 데이터에 있는 값으로 변환해 출력해주면 된다. 2. 코드 import sys IN = sys.stdin.readline if __name__ == "__main__": N = int(IN()) arr = list(map(int, IN().split())) sort_arr = sorted(set(arr)) # 중복된 수 제거 후 정렬 dic = {sort_arr[i]: i for i in range(len(sort_arr))} # 좌표 압축 사전화 s = "" # 문자열로 연결 for i in a..
[Python] 백준 12015번 문제, 가장 긴 증가하는 부분 수열 2 https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 주어진 수열에서 가장 긴 증가하는 부분 수열을 구하는 문제인데 입력 크기가 1 ≤ N ≤ 1,000,000이기 때문에 DP 방식으로 풀면 n^2의 시간 복잡도를 가져 시간 초과가 발생한다. 그래서 최장 증가 부분 수열(LIS) 알고리즘을 사용해야 하며, log n이라는 시간 복잡도를 가지는데 N만큼 동작해야 하므로 최종 시간 복잡도는 NlogN이다. A는 1부터 1,000,000까지의 범위이므로 ..
[Python] 백준 12738번 문제, 가장 긴 증가하는 부분 수열 3 https://www.acmicpc.net/problem/12738 12738번: 가장 긴 증가하는 부분 수열 3 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net 가장 긴 증가하는 부분 수열 시리즈 중 세번째 문제이며, 주어진 수열에서 가장 긴 증가하는 부분을 구하는 것인데 입력의 크기가 1 ≤ N ≤ 1,000,000 이기 때문에 기존의 풀이법인 동적 프로그래밍(Dynamic Programming)을 사용한다면 n^2의 시간 복잡도를 가지기 때문에 시간 초가로 실패한다. 따라서 DP 알고리즘이 아닌 최장 증가 부분 수열(LI..
[Python] 백준 14002번 문제, 가장 긴 증가하는 부분 수열 4 https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 수열이 주어졌을 때 가장 긴 증가하는 부분 수열을 구하는 문제이며, 시리즈 중 4번째 문제이다. 전과 달라진 점은 둘째 줄에 부분 수열을 출력해야 하며, 첫째 줄은 기존과 마찬가지로 부분 수열의 길이를 출력하면 된다. 동적 프로그래밍으로 풀이 가능하기 때문에 dp를 선언 한 다음에 A의 순서대로 2차원 배열 arr를..
[Python] 백준 2467번 문제, 용액 https://www.acmicpc.net/problem/2467 2467번: 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 - www.acmicpc.net 문제 해결 방법은 산성 용액과 알칼리성 용액을 보유하고 있는데 두 가지 용액을 혼합해 0에 가까운 용액을 만드는 것이다. (산성-산성, 알칼리성-알칼리성 혼합 가능) (용액 리스트는 오름차순으로 정렬 되어 있음) 그래서 이분 탐색을 이용해 합이 0에 가까운 두 개의 수를 구하는 것이 목적이다. 두 가지 용액을 혼합한 값을 min_num에 저장하고 result은 두 용액의 특성값을 저장하는 리..
[Python] 백준 1806번 문제, 부분합 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 문제 해결 방법은 길이가 N인 수열에서 부분합이 S가 넘거나 같은 부분의 최소 길이를 구하는 것이다. 투 포인트로 풀면 되기 때문에 양 끝 쪽에서 시작해 부분합들을 비교해가며 right - left의 결과로 부분합의 길이를 구하면 된다. # 1: 시작(0)부터 내(i)가 있는 곳의 부분합 # 2: 변수들 초기화, answer는 최대 1,000,000이기 때문에 1,000,001로 초..
[Python] 백준 11282-11285번 문제, 파이썬에서 한글을 숫자 또는 문자열로 표현하기 https://www.acmicpc.net/problem/11282 https://www.acmicpc.net/problem/11283 https://www.acmicpc.net/problem/11284 https://www.acmicpc.net/problem/11285 위에 언급한 네 개의 문제의 풀이는 모두 연관되어 있다. 왜냐하면 모두 한글을 문자열 또는 숫자로 표현하는 것이며, 좀 더 자세하게 이야기 하자면 한글을 문자열로 표현할 때 초성, 중성, 종성 또는 하나의 문자를 표현 가능하도록 해야 한다. 당연히 이런 문제는 알고리즘이 여러 개가 있는 것이 아니라 하나의 답만 존재하기 때문에 구글링 밖에 없다. 설명이 중복되고 길게 할 필요가 없기 때문에 아래 전체 코드에 주석으로 간단하게 설명하겠다...
[Python] 백준 12851번 문제, 숨바꼭질 2 https://www.acmicpc.net/problem/12851 12851번: 숨바꼭질 2 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 수빈이가 동생과 숨바꼭질 하고 있는데 수빈이가 동생을 찾는 가장 빠른 시간이 몇 초 후이며, 가장 빠른 시간으로 찾는 방법이 몇 가지인지 구하는 문제이다. 수빈이가 X(0 ≤ X ≤ 100,000)에 있다고 가정 했을 때, 1초에 { X-1, X+1, 2X }으로 이동할 수 있다. 이렇게 몇 초후에 동생이 있는 K(0 ≤ K ≤ 100,000)에 도달하는지 구..

728x90
반응형