728x90
1. 문제 설명
문제 : 3011 - 이름 지어주기 https://www.acmicpc.net/problem/3011
사용 언어 : 파이썬 (Pypy3)
문제요약 :
구간 [A, B]에 들어있는 수 중에서 수열들의 각 수들 중 가장 차이가 큰 홀수를 구하여라.
2. 문제 풀이
해설 :
우리는 기본적으로 2가지의 경우를 생각해 볼 수 있다.
첫 번째 경우는 기존의 수들 중에 답이 있는 것이다. 이 경우에는 아들들의 이름을 정렬시킨 후, i번째 수와 i+1번째 수의 중간으로 구할 수 있었다. 이는 (P[i]+P[i+1])/2로 구할 수 있다.
두 번째 경우는 A+1 혹은 B-1중 답이 있는 것이다. 이 경우에는 모든 아들들과의 거리 중 가장 짧은 거리를 비교하여 답을 구할 수 있었다. 아들이 최대 100명이기 때문에 O(N)으로 전체 탐색을 하거나 이분탐색 등의 방법으로 O(logN)으로 구할 수 있다.
코드 :
N = int(input())
names = sorted(list(map(int,input().split())))
A, B = map(int,input().split())
A += (1 if A%2 == 0 else 0)
B -= (1 if B%2 == 0 else 0)
cans = []
def change(x):
if not A <= x <= B: return 0
if x%2 == 1: return x
if A <= x-1: return x-1
elif x+1 <= B: return x+1
for i in range(N-1):
temp = (names[i]+names[i+1])//2
temp = change(temp)
if temp: cans.append([temp, min(abs(temp-names[i]), abs(temp-names[i+1]))])
min_A, min_B = 2e9, 2e9
for i in range(N):
min_A = min(min_A, abs(names[i]-A))
min_B = min(min_B, abs(names[i]-B))
cans.append([A, min_A]); cans.append([B, min_B])
cans.sort(key=lambda x:-x[1])
print(cans[0][0])
코딩과 알고리즘 관련 글을 업로드하고 있습니다!
아직 배우는 중이라서 부족한 점이 있으면 댓글 남겨주시면 감사하겠습니다!!
728x90
'🤖 알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[파이썬] 18185 라면사기 Small (백준) (3) | 2024.02.14 |
---|---|
[파이썬] 28218 격자 게임 (백준, KOI 1차) (0) | 2024.02.14 |
[파이썬] 1219 오민식의 고민 (백준) (0) | 2023.12.31 |
[파이썬] 1738 골목길 (백준) (0) | 2023.12.31 |
[파이썬] 1865 웜홀 (백준) (0) | 2023.12.28 |