다시 풀어보는 일곱난쟁이

청천·2022년 10월 19일
0

백준

목록 보기
32/41

문제 제목: 일곱 난쟁이
링크: https://www.acmicpc.net/problem/2309
관찰: 9명 중 난쟁이가 아닌 2명 찾기, 일곱난쟁이 키의 합은 100 , 일곱난쟁이를 출력
문제 접근:
일곱난쟁이 키의 합은 100인것을 활용

예제를 보면 9명의 키의 합은 140

즉, 나머지 인원의 키의 합은 40이다.

완전 탐색을 이용해 풀면 다음과 같다.

for i in range(8):

​ for j in range(i+1, 9):

를 해서 i + j 가 40인 것을 찾으면 된다.

시간 복잡도는 n^2

투포인터를 이용해 풀면 다음과 같다.

예제를 정렬 하면

7 8 10 13 15 19 20 23 25

s

e

s + e 의 합이 40이 넘으면 e를 왼쪽으로 옮기고

40 미만이면 s를 오른쪽으로 옮긴다.

시간 복잡도는 nlogn

# 투 포인터
# spy 변수는 9명의 키의 합 - 100(일곱난쟁이의 키의 합) 입니다. 
# 두 사람의 키의 합이 spy변수라면 두 사람은 spy입니다. 
# check함수는 이러한 두 사람을 찾는 역할을 합니다.
def check():
    s = 0    
    e = 8
    while small[s] + small[e] != spy:     # 고른 두개의 합이 spy 이냐? 
        if small[s] + small[e] < spy:     # spy 키의 합보다 작으면    
            s += 1
        elif small[s] + small[e] > spy:   # 크면
            e -= 1
    return s, e


small = sorted([int(input()) for _ in range(9)]) # 투 포인터를 위해 정렬
spy = sum(small) - 100
spy1, spy2 = check() # 스파이 값을 만족하는 변수 인덱스를 할당 


for s in range(9):
    if s != spy1 and s != spy2: # 스파이가 아닌 값을 찾아 출력
        print(small[s])

요즘 실력이 퇴보하는 거 같아 예전에 푼 문제들, 배운 유형들을 복습하고 있다.
확실히 2달 전 푼 내 코드에 비해 나은 것 같다. 발전은 있긴 했구나.

0개의 댓글