돌아온 아홉 난쟁이들 중 난쟁이들의 키의 합이 100이라는 단서를 토대로 스파이 2명을 제외한 일곱 난쟁이들을 순서대로 출력
알고리즘: Brute Force
import sys
seven = [int(sys.stdin.readline()) for i in range(9)]
ret = sum(seven)
flag = 0
for i in range(8):
for j in range(i + 1, 9):
if (ret - (seven[i] + seven[j]) == 100): # 아홉 난쟁이들의 키 합에서 차례대로 선택된 두 난쟁이의 키를 뺀 값이 100일 경우 그 두명이 잡았다 요놈!
a, b = seven[i], seven[j]
seven.remove(a)
seven.remove(b)
seven.sort()
flag = 1 # 가능한 정답이 여러가지인 경우에는 아무거나 출력하라고 되어 있으므로, 답을 찾을 경우 바로 종료할 수 있도록 flag 처리
for k in range(7):
print(seven[k])
break
if (flag == 1):
break
브루트포스 관련 문제로 크게 어렵지 않게 풀 수 있었던 문제였다.
이 문제를 풀면서 새롭게 알게된 건,
seven = [int(sys.stdin.readline()) for i range(0)]
바로 이 부분! 이렇게 리스트를 만들 수 있다니 😮 왕 신기 파이썬.. 정말 신기한 게 많군요?
그치만 신기한 걸로 끝낼 순 없으니까, 여기서 궁금했던 것 ☝🏼한가지.
list = list(map(int, sys.stdin.readline().split())
이 전까지 공백을 기준으로 한 줄에 입력값이 여러개 들어올 경우 위와 같이 작성을 해왔는데
list = [map(int, sys.stdin.readline().split())]
저런 형태가 가능하다면 이렇게 쓰는 것도 되나? 대괄호가 list로 형변환을 해주는건가? 하는 의문이 들었다
하지만 저렇게 작성하면 바로 뚜들뚜들 TypeError를 맞게 된다
왜? 🤔 list = []
와 같은 식으로 선언도 가능하면서 대체 why??
대괄호가 list형으로 만들어 주는 거 아니었어? 했지만, 경기도 오산이었나보다 map으로 받은 것은 여전히 map형이었다
그렇다면 처음과 같은 입력은 어떻게 가능한 것일까?
아직 파이썬을 제대로 공부하질 않아서 자세히는 모르겠지만
list = [0 for i in range (9)]
이와 같이 대괄호 내에서 for 문으로 입력값을 채울 경우 각 요소마다 해당 값을 list.append(i)
형태로 list에 넣어주는 것 같다
결국, 대괄호 내에 iterable한 요소가 있을 경우 해당 요소들을 순회하며 append 함수가 실행되는 꼴이라고 보면 될 것 같다
내가 의문을 가진 형태는 map형으로 반환되기 때문에 iterable하지 않아서 적용이 될 수 없었던 것이다
따라서 map형과 같은 경우에는 list()와 같이 형변환을 해줘야지만 list로 사용이 가능하다는 것!
파이썬에서는 iterator 객체들에 대한 이해도가 높아야 잘 써먹을 수 있는 함수들이 많은 것 같다
이딴 것도 몰라? 할 수 있지만, 예! 저는 이딴 것도 몰랐습니다!
✌🏼 두번째로 생각해 볼 것은 삽질했던 부분.
해당하는 두 난쟁이를 찾고나서 값을 저장하지 않고 바로 seven.remove(i), seven.remove(j) 같은 멍청한 짓을 했었다
index가 바뀌잖아요 이 멍청아! 기억하자 기억하자!
풀다가 아니 이게 왜 값이 안 나오지..? 하면서 한참 고민함
for문 돌릴 때 range값도 좀 생각을 하시길..
그것때문에 얼탱이 없이 백준에서 시도 횟수가 한 번 더 늘어났다 ㅎ
내 정답률 또르륵 눈물이 흘러간다 또르륵