오구의코딩모험

[Python] 1059번 : 좋은 구간 본문

프로그래밍 공부/백준 알고리즘

[Python] 1059번 : 좋은 구간

오구.cpp 2022. 8. 5. 13:48
반응형

 

문제 설명

복잡해보이지만 제한 조건과 예시를 보면

보다 쉽게 이해할 수 있다!

 

첫 줄은 집합 S의 크기,

두 번째 줄은 집합의 원소들,

세 번째 줄은 정수 n

 

따라서

크기가 4인 집합 S = [1, 7, 14, 10] 에서 2를 포함하는 좋은 구간을 구하라!

라고 해석할 수 있겠다.

 

좋은 구간의 원소들은

집합 S에 속하지 않으므로

[1,2]가 아닌 2부터 시작하고, A<B를 만족해야하기 때문에

[2,3] 부터 시작한다!

 

 

그럼

기본적인 입력 틀부터 작성

# 집합 S의 크기 L 입력
L = int(input())
S = []

# 집합에 포함될 정수 입력
idx = input()
answer = 0

if __name__ == '__main__' :
    # 입력 받은 정수 집합 S에 삽입 및 정렬
    for count in range(L):
        index = idx.split()
        S.append(int(index[count]))
    S.sort()
    
    # n 입력
    n = int(input())

S의 원소들을 삽입한 후,

값을 오름차순으로 정렬하여 작은 값부터 비교해볼 것이다!

 

	i = 0

	# 집합 S와 n 비교

	for i, compare in enumerate(S):
      
        # n이 집합 s의 원소와 같다면, 좋은 구간은 없다.
        if compare == n:
            print(answer)
            break
        
        # 제한 : n <= 집합 S에서 가장 큰 정수
        if compare > n:
            break

정수 n이 집합 S의 원소 중 하나와 같다면

좋은 구간은 만들어질 수 없으므로 0을 반환!

 

S의 i번째 원소가 n보다 커지는 순간 반복문을 멈추고

좋은 구간을 찾아보자!

 

	# n이 집합 S의 원소 사이에 있을 때 == 좋은 구간이 존재할 때
    if i != 0:
        if S[i] != n :
            # S[i-1] < n < S[i]인 경우
            if (n - S[i-1]) == 1:
                print(1*(S[i]-n-1))
            else :
                print((n-S[i-1])*(S[i]-n)-1)
                
    # 1 <= n < S[0] 인 경우
    if S[0] > n :
        if n == 1:
            print(1*(S[0]-n)-1)
        else :
            print(n*(S[0]-n)-1)

 

좋은 구간이 존재하는 경우에서

 

1. n이 원소 사이에 끼어 있는 경우

2. n이 1과 원소 사이에 끼어 있는 경우

 

두 가지 경우를 고려해줘야한다!

 

2번을 고려하지 않아

채점 과정 중에 몇 번 틀렸다.. 

 

좋은 구간의 개수는

앞서 했던 예시와 같이 경우의 수와

정수 n과 원소 사이의 차이만큼 곱해주는 방식으로 구하였다!

 

ex)

14 와 20 사이에 정수는 몇 개?

(20-14) -1 = 5개 

 

 

 

결과

 

짜잔

 

 

반응형
Comments