N=int(input())
char_list = list(input())
num_list=list(map(int, char_list))
print(sum(num_list))

Q. N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.
- 입력 : 첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
- 출력 : 입력으로 주어진 숫자 N개의 합을 출력한다.

1. 첫 시도 - 오류, split() 함수

split() 함수는 문자열을 괄호 안에 넣은 값을 기준으로 쪼개주기 때문에, 나는 당연히 연결된 문자열을 쪼개기 위해서 split('')을 사용하였다.

N=int(input())
num_list=list(map(int, input().split('')))
print(sum(num_list))

위와 같이 코드를 작성하고, 원하는 대로 실행되기를 바랬으나
empty separator
와 같은 오류가 발생했다. 찾아보니, 파이썬 내장함수 split()은 연속된 글자를 쪼개는 기능을 제공하지 않는다. 

왜 그런가 잠시 이유를 생각해봤는데, 단순히

list(문자열)

방법만으로도 원하는 결과를 얻을 수 있기 때문에, 굳이 제공하지 않는 것 같다. 그리고 사용자가 실제로 원하는 값이 맞는지 확인하기 어렵기도 하고, 그래서가 아닐까 에측해본다.

 *참고로 split은 축약형부터 완성형까지 다음과 같이 사용된다.

문자열.split()

문자열.split('구분자')

문자열.split('구분자', 분할횟수)

문자열.split(sep='구분자', maxsplit=분할횟수)

궁금해서 마지막 완성 형태로도 작성해봤는데, 역시 연속된 문자열은 제공하지 않는다.

 

2. 두 번째 시도 - 오류, list 내의 모든 요소들의 자료형 변환 시도
N=int(input())
char_list = list(input())
num_list=int(char_list)
print(sum(num_list))

혹시 int(리스트명)의 방식으로, 리스트 내의 모든 문자열 요소들을 int로 바꿀 수 있는지 시도해봤다.

하지만 다음과 같은 오류가 떴으며, list에 대해서는 이와 같은 type 변경을 제공하지 않는다.

int() argument must be a string, a bytes-like object or a number, not 'list'
*list의 type변경 방법
list_int= list(map(int, list_str)) # 정수로 변환
list_str = list(map(str, list_int)) # 문자열로 변환
기존에 사용하던 map() 함수를 사용하면 된다. 

왜 map()을 사용해도 되는거지?하고 부족한 map() 함수의 개념을 채워봤다.

*map() 함수
map(함수, 반복 가능한 자료형)
- 반복 가능한 자료형 : 리스트, 튜플 형태
- 함수 : 리스트 혹은 튜플의 각 요소들을 꺼내서, 함수를 적용시키고, map요소 형태로 반환한다.
*map요소 형태로 반환하기 때문에, 리스트로 만들고 싶다면 다시 list()로 감싸줘야한다.

그렇군! 그동안 map() 함수를 왜 사용하는지 모르고 사용했었는데, 이번에 확실히 알게됐다.

그러면 이제 코드를 완성시켜보자.

 

3. 세 번째 시도
원리 이해를 위해 풀어본 코드
char_list = list(input())
print(char_list)
num_list=list(map(int, char_list))
print(num_list)
print(sum(num_list))​

 

실행 결과는 다음과 같이 나온다.
5
12345
['1', '2', '3', '4', '5']
[1, 2, 3, 4, 5]
15​
답안
N=int(input())
char_list = list(input())
num_list=list(map(int, char_list))
print(sum(num_list))​

사실 이렇게 작성했을 때, N이 필요가 없다. 근데 대부분의 답안 사이트는 N을 무시하기 때문에 우선은 납둔다.

나중에는 N의 개수와 ,len(num_list)가 맞지 않으면, 다시 입력하라는 방식으로 N을 적용시킬 수 있을 것 같다.

문제 자체는 가볍지만 무언가 많이 배웠다 ㅎㅎ

글 작성하는게 목적이 아니라, 공부하는게 목적이기 때문에 틀린 내용을 발견한다면 언제든 댓글 부탁드린다.

오늘도 파이팅

+ Recent posts