자료구조, 알고리즘/브루트포스

[백준] 2309 일곱 난쟁이(브루트포) - Python

개른 2023. 3. 4. 14:08

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

 

stack = []
ans = []
result = []
for i in range(9):
    num = int(input())
    stack.append(num) # num이라는 배열에 입력값 받기

for i in range(9): # 9가지 중 2가지 수를 빼서 나머지 들의 합이 100이 되는지 확인
    for j in range(9):
        if i == j: # 같은 수를 뺄 때는 continue로 건너뛰기
            continue
        temp_i = stack[i] # 임시 변수에 받아두기
        temp_j = stack[j]
        stack[i] = 0
        stack[j] = 0
        if sum(stack) == 100: # 나머지 수들의 합이 100이 될 경우
            ans.append(i) # 두 개의 값을 ans 리스트에 넣어놓고
            ans.append(j)
        else:
            stack[i] = temp_i # 다시 그 자리에 넣기
            stack[j] = temp_j

stack[ans[0]] = 0 # 스택에 빼야 되는 수 2개를 넣기
stack[ans[1]] = 0
for s in stack: 
    if s != 0:
        result.append(s) # 빼야되는 수들을 빼고 정답 리스트에 넣고 출력
result = sorted(result)
for s in result:
    print(s)

 

- 접근방식: 맨 처음에는 9가지 수들 중 7가지를 더해줘야하니 재귀로 풀어야 하나 싶었지만, 반대로 생각하여 9가지 중 2가지를 뺐을 때 합이 100이 된다는 것이므로 2가지를 빼줬을 때 합이 100이 되는지 확인하여 풀었다.

- 느낀점: 생각이 막힐 땐 반대로 생각해보자