서울에서 김서방 찾기는 역시 어려웠다.
프로그래머스가 내게 서울에서 김서방을 찾아보라며 준 문제는 다음과 같았다.
String형 배열 seoul의 element중 Kim의 위치 x를 찾아, 김서방은 x에 있다는 String을 반환하는 함수, solution을 완성하세요. seoul에 Kim은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
- 제한 사항
- seoul은 길이 1 이상, 1000 이하인 배열입니다.
- seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
- Kim은 반드시 seoul 안에 포함되어 있습니다.
- 입출력 예
seoul return [Jane, Kim] 김서방은 1에 있다
물론 나는 파이썬을 막 배우기 시작했고! 삽질이 당연하다!
그러다 정답 직전, 정답과 오답 사이를 갈랐던 삽질은 파이썬 함수의'print'와 'return'의 차이를 이해 못해서 발생한 삽질이었다.
<오답>
def solution(seoul):
a = seoul.index("Kim")
print("김서방은 {}에 있다".format(a))
<정답>
def solution(seoul):
a = seoul.index("Kim")
return "김서방은 {}에 있다".format(a)
REPL환경에서는 어떤 것들은 return
해주기만 해도 print
해주기도 하는데, 그로 인해 값을 반환하라는 주문은 print
하라는 것과 같다고 오해한 것이다. 그렇지만 print
는 화면에 '인쇄'하는 작업일 뿐이고, 함수의 결과로서 값을 '전달', '반환'하지는 않는다.
이해를 도와주시기 위해 조교님께서 친히 코드 하나를 짜 주셨고, 이를 통해 print와 return의 차이를 어느 정도 이해한 것 같다. 잊기 전에 정리해본다.
def count_people(seoul):
cnt = 0
for elem in seoul:
if elem == 'money':
return -1
if elem == 'people':
cnt += 1
print(f'{cnt}명의 people이 있습니다'.format(cnt))
p = count_people(seoul)
if p == -1:
print('리스트에 잘못된 값이 있습니다.')
이 함수는 seoul
이라는 리스트 속에 people
이 있다면 people
의 수를 세어서 프린트해주기 위한 함수다. 다만, 리스트에 money
와 같은 '잘못된 값'이 있을 경우 걸러볼 수 있기를 기대하시며 return -1
부분을 만들어두셨다. (아마도?)
이 코드는 다음과 같이 동작한다 이해했다.
- 함수를 정의하는 코드는 아무것도 출력하지 않는다. '함수를 정의하는 코드'일 뿐, 함수의 결과값을 보기 위해서는 정의된 함수를 사용하는 코드가 따로 있어야 한다.
seoul
안에 'money'가 있다면,count_people(seoul)
은 -1을 리턴할 뿐,return
명령어를 만나면 함수가 종료되기 때문이다. 'money'가 없다면return
없이 마지막if p == -1: print('리스트에 잘못된 값이 있습니다.')
부분에서는count_people
함수에 'money'가 있어count_people(seoul)
-1을 리턴한다면, '리스트에 잘못된 값이 있습니다'를 출력한다. -1이 출력되지 않고count_people(seoul)
이 그저
seoul
의 리스트를 조금씩 변경해가며 테스트해보면
seoul
에 'money'가 없고 'people'이 두 번 들어가있는 경우seoul
에 'money'가 있는 경우질문 폭탄을 던졌는데도 친절히 답변해주신 조교님께 무한 감사를 🥺