11568번: 민균이의 계략
민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을 준비하여 준민이에게
www.acmicpc.net
문제
민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을 준비하여 준민이에게 정해진 순서대로 보여줄 것이다. 준민이는 앞의 카드부터 임의의 개수만큼 골라서 민균이에게 제시하게 되는데, 제시한 카드의 수열이 순증가가 아니면 민균이에게 바보라고 놀림받게 된다. 예를 들어 민균이가 보여준 카드가 {4, 9, 10, 9} 일 때 준민이가 {4, 9}를 골랐다면 놀림을 받지 않겠지만, {4, 10, 9}이나 {9, 9}를 제시하면 놀림받게 될 것이다.
생각보다 바보가 아닌 준민이는 한번도 민균이에게 놀림을 받지 않았다. 이에 분노한 민균이는 하나의 조건을 더 추가했다. 이제 준민이가 제시해야하는 수열은 순증가여야 할 뿐만 아니라, 원소의 개수가 제일 많은 수열이여야 한다. 예를 들어 민균이가 보여준 카드가 {8, 9, 1, 2 ,10}일 때 준민이가 {8, 9, 10} 또는 {1, 2, 10}을 골랐다면 놀림을 받지 않겠지만, {8, 9}나 {1, 2}를 제시하면 놀림받게 될 것이다.
당황한 준민이는 일단 제시할 수 있는 수열의 원소의 최대 개수를 구해보기로 하였다. 예를 들어 {8, 9, 1, 2, 10}에서의 원소의 최대 개수는 3이 될 것이다. 도저히 못 풀겠어서 고민하던 준민이는 똑똑하기로 소문난 당신을 찾아가 이 문제를 의뢰하였다! 불쌍하고 딱한 준민이를 위해 이 문제를 해결하는 프로그램을 작성해보자.
입력
첫 번째 줄에는 민균이가 제시한 카드의 개수 N (1 ≤ N ≤ 1,000)이 주어진다.
두 번째 줄에는 민균이가 제시한 카드 N개에 들어있는 정수가 공백(빈 칸)으로 구분되어 주어진다.
각 정수는 1 이상 100,000,000 이하의 자연수이다.
출력
준민이가 제시할 수 있는 수열의 원소의 최대 개수를 출력한다.
코드
n = int(input())
cards = list(map(int, input().split()))
lis = [cards[0]]
# arr에서 v가 들어갈 위치 찾기
def binary_search(l, r, v, arr):
while l < r:
mid = (l+r) // 2
if arr[mid] < v:
l = mid + 1
else:
r = mid
return r
for i in range(1, n):
pos = binary_search(0, len(lis), cards[i], lis)
if pos >= len(lis):
lis.append(cards[i])
else:
lis[pos] = cards[i]
print(len(lis))
최장 증가 부분 수열을 저장할 배열 lis를 만든다.
binary_search 함수는 이분탐색을 이용하여 arr 배열에서 v가 들어갈 위치를 찾는 함수이다.
cards 배열의 수를 앞에서부터 차례로 하나씩 살펴보며 lis를 구하는데 cards[i]의 값이 lis에 이미 저장된 수들보다 크면 lis배열에 추가되는 것이므로 cards 배열의 끝까지 다 탐색해보면 결국 lis 배열의 길이가 최장 증가 부분 수열의 길이라는 것을 알 수 있다.
DP를 이용한 풀이
[Python/파이썬] 백준 11568번 민균이의 계략
11568번: 민균이의 계략 민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을
zero0205.tistory.com
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 1300번 K번째 수 (0) | 2023.08.08 |
---|---|
[Python/파이썬] 백준 16434번 드래곤 앤 던전 (0) | 2023.07.27 |
[Python/파이썬] 백준 18113번 그르다 김가놈 (0) | 2023.07.19 |
[Python/파이썬] 백준 18114번 블랙 프라이데이 (0) | 2023.07.05 |
[Python/파이썬] 백준 17951번 흩날리는 시험지 속에서 내 평점이 느껴진거야 (0) | 2023.06.29 |
11568번: 민균이의 계략
민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을 준비하여 준민이에게
www.acmicpc.net
문제
민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을 준비하여 준민이에게 정해진 순서대로 보여줄 것이다. 준민이는 앞의 카드부터 임의의 개수만큼 골라서 민균이에게 제시하게 되는데, 제시한 카드의 수열이 순증가가 아니면 민균이에게 바보라고 놀림받게 된다. 예를 들어 민균이가 보여준 카드가 {4, 9, 10, 9} 일 때 준민이가 {4, 9}를 골랐다면 놀림을 받지 않겠지만, {4, 10, 9}이나 {9, 9}를 제시하면 놀림받게 될 것이다.
생각보다 바보가 아닌 준민이는 한번도 민균이에게 놀림을 받지 않았다. 이에 분노한 민균이는 하나의 조건을 더 추가했다. 이제 준민이가 제시해야하는 수열은 순증가여야 할 뿐만 아니라, 원소의 개수가 제일 많은 수열이여야 한다. 예를 들어 민균이가 보여준 카드가 {8, 9, 1, 2 ,10}일 때 준민이가 {8, 9, 10} 또는 {1, 2, 10}을 골랐다면 놀림을 받지 않겠지만, {8, 9}나 {1, 2}를 제시하면 놀림받게 될 것이다.
당황한 준민이는 일단 제시할 수 있는 수열의 원소의 최대 개수를 구해보기로 하였다. 예를 들어 {8, 9, 1, 2, 10}에서의 원소의 최대 개수는 3이 될 것이다. 도저히 못 풀겠어서 고민하던 준민이는 똑똑하기로 소문난 당신을 찾아가 이 문제를 의뢰하였다! 불쌍하고 딱한 준민이를 위해 이 문제를 해결하는 프로그램을 작성해보자.
입력
첫 번째 줄에는 민균이가 제시한 카드의 개수 N (1 ≤ N ≤ 1,000)이 주어진다.
두 번째 줄에는 민균이가 제시한 카드 N개에 들어있는 정수가 공백(빈 칸)으로 구분되어 주어진다.
각 정수는 1 이상 100,000,000 이하의 자연수이다.
출력
준민이가 제시할 수 있는 수열의 원소의 최대 개수를 출력한다.
코드
n = int(input()) cards = list(map(int, input().split())) lis = [cards[0]] # arr에서 v가 들어갈 위치 찾기 def binary_search(l, r, v, arr): while l < r: mid = (l+r) // 2 if arr[mid] < v: l = mid + 1 else: r = mid return r for i in range(1, n): pos = binary_search(0, len(lis), cards[i], lis) if pos >= len(lis): lis.append(cards[i]) else: lis[pos] = cards[i] print(len(lis))
최장 증가 부분 수열을 저장할 배열 lis를 만든다.
binary_search 함수는 이분탐색을 이용하여 arr 배열에서 v가 들어갈 위치를 찾는 함수이다.
cards 배열의 수를 앞에서부터 차례로 하나씩 살펴보며 lis를 구하는데 cards[i]의 값이 lis에 이미 저장된 수들보다 크면 lis배열에 추가되는 것이므로 cards 배열의 끝까지 다 탐색해보면 결국 lis 배열의 길이가 최장 증가 부분 수열의 길이라는 것을 알 수 있다.
DP를 이용한 풀이
[Python/파이썬] 백준 11568번 민균이의 계략
11568번: 민균이의 계략 민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을
zero0205.tistory.com
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 1300번 K번째 수 (0) | 2023.08.08 |
---|---|
[Python/파이썬] 백준 16434번 드래곤 앤 던전 (0) | 2023.07.27 |
[Python/파이썬] 백준 18113번 그르다 김가놈 (0) | 2023.07.19 |
[Python/파이썬] 백준 18114번 블랙 프라이데이 (0) | 2023.07.05 |
[Python/파이썬] 백준 17951번 흩날리는 시험지 속에서 내 평점이 느껴진거야 (0) | 2023.06.29 |