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변경 방법
기존에 사용하던 map() 함수를 사용하면 된다.list_int= list(map(int, list_str)) # 정수로 변환 list_str = list(map(str, list_int)) # 문자열로 변환
왜 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을 적용시킬 수 있을 것 같다.
문제 자체는 가볍지만 무언가 많이 배웠다 ㅎㅎ
글 작성하는게 목적이 아니라, 공부하는게 목적이기 때문에 틀린 내용을 발견한다면 언제든 댓글 부탁드린다.
오늘도 파이팅
'코딩테스트 준비 > Python' 카테고리의 다른 글
백준 2775 python : 부녀회장이 될테야 (0) | 2023.08.20 |
---|---|
1676 python 팩토리얼 0의 개수 4가지 풀이법 (0) | 2023.08.16 |
[백준/python] 2884번: 알람 시계 (0) | 2023.04.15 |
[백준/python] 14681 사분면 고르기 (1) | 2023.04.13 |
백준 2753 python : 윤년판별 (0) | 2023.04.06 |