본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2309번: 일곱 난쟁이 -Python

728x90

[백준알고리즘] 2309번: 일곱 난쟁이 -Python

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

케이스가 작기 때문에 모든 경우를 반복문으로 돌려도 상관없으나 나같은 경우에는 포인터를 두개 두고 한명씩 인덱싱해가면서 두명을 걸러내도록 했다.

 

정렬을 하고, 한명은 왼쪽에서부터 다른 한명은 오른쪽에서부터 인덱싱해가면서 해당 두명을 제외한 일곱명의 키를 구한다.

 

이 키가 100보다 클 경우에는 더 키가 큰 사람을 제외해야하기 때문에 오름차순으로 정렬된 상태의 난쟁이들이기 때문에, 왼쪽 포인터를 하나 오른쪽으로 옮기면서 더 키가 큰 두사람을 인덱싱하도록 한다.

반대로 키가 100보다 작다면 더 키가 작은 사람을 제외해야한다는 것이기 때문에 오른쪽 포인터가 가리키는 난쟁이의 왼쪽 난쟁이를 포함시키면서 더 키가 작은 두사람을 인덱싱하도록 했다.

h = sorted([int(input()) for _ in range(9)])
seven = sum(h)
lp, hp = 0, 8

while lp < hp:
    seven -= (h[lp] + h[hp])
    if seven == 100:
        for i in range(9):
            if i == lp or i == hp:
                continue
            print(h[i])
        break
    
    if seven < 100:
        seven += (h[lp] + h[hp])
        hp -= 1
    else: # seven > 100
        seven += (h[lp] + h[hp])
        lp += 1
    

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90