문제
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
정답 소스코드 (Python)
arr=[]
result=[]
find_result=False
sum=0
for i in range(9):
tmp=int(input())
arr.append(tmp)
sum+=tmp
for i in range(9):
for j in range(i+1,9):
tmp_sum=sum-arr[i]-arr[j]
if tmp_sum==100:
result.extend([arr[i],arr[j]])
find_result=True
break
if find_result:break
arr.sort()
for ele in arr:
if ele not in result:print(ele)
풀이 (Python)
전형적인 브루트포스 문제이다. 9개의 입력밖에 없고, 시간은 2초나 됨으로써 문제를 읽지않고도 브루트포스 알고리즘을 선택할 수 있다고 볼 수 있다.
문제의 전체적인 풀이는 9명의 난쟁이에서 2명을 빼고 7명을 더해서 100이 되는지 확인하는 것이 아니라, 9명을 모두 sum이라는 변수에 더해놓고, 2명을 빼서 100이 되는지 확인하였다.
브루트 포스 알고리즘 즉 모든 경우의 수를 검사하여 i와 j를 총합에서 뺀경우 100이된다면, 결과값에 저장한다.
tmp_sum=sum-arr[i]-arr[j]
if tmp_sum==100:
result.extend([arr[i],arr[j]])
이후 result리스트에 포함되어 있는 원소 2개를 제외한 나머지를 출력하면 되기 때문에 조건문으로 not in 연산자를 통해 result리스트 안에 없는 값이면 출력되도록 설계하였다.
for ele in arr:
if ele not in result:print(ele)
Point 1) 이중 for문 탈출
for i in range(9):
for j in range(i+1,9):
tmp_sum=sum-arr[i]-arr[j]
if tmp_sum==100:
result.extend([arr[i],arr[j]])
find_result=True
break
if find_result:break
현 풀이에서는 위와 같이 find_result변수를 따로 지정하여서 조건을 만족하면 True로 변환하고 밖에 for문에서도 바로 탈출하게 끔 설게하였다.
다른 방법으로는 이중 for문의 경우 함수로 처리하여 return을 하여 바로 탈출 할 수 있도록 설계할 수도 있다.
새로운 함수를 설정하여 break대신 return을 사용하는 방법이다.
def check(arr,sum):
result=[]
for i in range(9):
for j in range(i+1,9):
tmp_sum=sum-arr[i]-arr[j]
if tmp_sum==100:
result.extend([arr[i],arr[j]])
return result
'Baekjoon' 카테고리의 다른 글
[백준] 2503번 숫자 야구 (파이썬) (1) | 2024.01.28 |
---|---|
[백준] 10974번 모든 순열 (파이썬) (1) | 2024.01.28 |
[백준] 4485번 녹색 옷 입은 애가 젤다지? (파이썬) (0) | 2024.01.23 |
[백준] 13549번 숨바꼭질 3 ( 파이썬) (2) | 2024.01.22 |
[백준] 14940번 쉬운 최단거리 ( 파이썬) (1) | 2024.01.22 |