본문 바로가기

728x90

CS Study/Algorithm(Coding Test)

(21)
[BOJ] 14003. 가장 긴 증가하는 부분 수열 5 (Python) 14003번: 가장 긴 증가하는 부분 수열 5 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net 가장 긴 증가하는 부분 수열을 DP로 구하는 방법은 저번에 설명했었다. 이번에는 Lower Bound를 통해서 구하는 방법에 대해 설명하겠다. 먼저 배열 내에서 가장 긴 증가하는 부분 수열의 길이를 구하고자 할 때 첫 번째 숫자부터 순서대로 확인해보면 된다. 이때 1. 현재까지 구한 LIS의 마지막 값보다 더 크면 그냥 값을 이어 붙이면 된다. 2. 현재까지 구한 LIS의 마지막 값보다 작으면 LIS 내에서의 Lower Bound 위..
[BOJ] 2042. 구간 합 구하기 (Python) 2042번: 구간 합 구하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄 www.acmicpc.net 이번에는 문제의 목적에 맞게 세그먼트리를 이용해서 구간 합을 구해보자! 이번 문제는 앞선 문제에서 구간 합을 업데이트 하는 기능까지 추가되었다. 구간 합 구하기 문제는 세그먼트 트리의 가장 대표적인 문제 유형이라고 볼 수 있다. 나는 안경잡이 개발자님의 블로그를 참고해서 세그먼트 트리 개념을 익혔다. 원리와 코드가 매우 잘 설명이 되어 있다. 세그먼트 트리에 대해 처음 접하는 분들은 먼저 아래 블로그 글..
[BOJ] 11659. 구간 합 구하기 4 (Python) 11659번: 구간 합 구하기 4 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j www.acmicpc.net 세그먼트 트리 알고리즘을 공부해야겠다 라고 생각만 하다가 이번 코테에서 제대로 뒷통수 맞고 공부하는 글... 소 잃고 외양간 고치기...^^...껄껄 일단 이 문제는 세그먼트 트리로 문제를 풀기에 앞서 DP로 풀어보는 문제이다! 구간 합이란 i번째 숫자부터 j번째 사이의 숫자 합을 구하라는 뜻이다. 문제의 예제로 설명해보자면 다음과 같이 숫자가 저장이 되어있을 때 5 | 4 | 3 | 2 | 1 2 ~ 3 번째 구간 합을 구하세요! 라고 하..
[BOJ] 14002. 가장 긴 증가하는 부분 수열 4 (Python) 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 가장 긴 증가하는 부분 수열 (최장 증가 수열), LIS라고도 불리는 알고리즘 문제! 굉장히 기초 알고리즘 문제 중에 하나라고 할 수 있다. 최장 증가 수열을 푸는 방법은 크게 다이나믹 프로그래밍(DP), Lower Bound 두 가지 방법이 있다. 14002번 문제의 경우 DP로도 충분히 제한 시간 안에 풀 수 있고, "동적 계획법과 최단거리 역추적"에 포함되어 있으므로 DP로 풀..
[BOJ] 12852. 1로 만들기 2 (Python) 12852번: 1로 만들기 2 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다. www.acmicpc.net 다이나믹 프로그래밍의 bottom-up 방식으로 풀 수 있는 가장 대표적인 문제 중 하나인 1로 만들기! 문제도 간단, 아이디어도 간단하다. X라는 숫자를 1로 만들기 위해서 할 수 있는 작업은 아래와 같다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 이는 반대로 생각하면 X라는 숫자를 만들기 위해서 할 수 있는 일은 다음과 같다고 볼 수 있다. X / 3인 숫자에 3을 곱해서 X를 만든다. X / 2인 숫자에 2를 곱해서 X를 만든다. X-1인 숫자에 1을 더한다. 그럼 이제 우리는 2부터 X까지 각각 숫자를..

728x90