JSITCLUB
파이썬 - 프로그래머스 - 자릿수 더하기 본문
프로그래머스 level 1
문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
제한사항
-
N의 범위 : 100,000,000 이하의 자연수
입출력 예
N |
answer |
123 |
6 |
987 |
24 |
입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.
풀이 및 코드 |
문제 요약
숫자의 각 자릿수의 합 구하기
문제 해설
이 문제의 가장큰 목표는 주어진 숫자에서 각 자리의 숫자를 가져오는 것입니다.
이 문제를 파이썬을 처음 배우는 분들께 물어보면 대부분 문자열로 바꾸어 하나씩 더하는 방법을 이야기합니다.
하지만 이 방법은 문자와 숫자 형 변환이 비교적 자유로운 파이썬에서는 편할지 몰라도 다른 언어에서는 오히려 복잡해질 수도 있습니다.
또한 숫자를 문자열로 변환해 잘라내고, 다시 잘라낸 문자를 숫자로 변환해 더하는 것이 별로 효율적으로 보이지는 않습니다.
그래서 오늘은 문자열로 변환해서 푸는 방법과 수학적으로 푸는 방법을 소개하겠습니다.
문자열로 형 변환해서 푸는 방법
1. 입력된 N(정수형)을 문자로 형 변환한다.
2. 형 변환된 문자열의 길이만큼 반복하면서 각 자리 값을 갖고 온다.
3. 갖고 온 자리값을 숫자로 변환해 변수에 합한다.
알고리즘이 정해 졌으니 이제 코드로 표현해 보겠습니다.
먼저 숫자를 문자로 형 변환하는 함수는 str()입니다.
(참고로 int(), list(), tuple()과 같이 각 자료형 이름으로 만들어진 함수가 형 변환 함수입니다. )
변환된 문자열은 for문을 이용해서 각 자리의 수를 하나씩 출력할 수 있겠죠?
N=123
for n in str(N):
print(n)
여기까지 이해되었다면 거의 끝났습니다.
변수를 하나 만들어 변수에 차곡차곡 누적하여 끝까지 더하면 합계가 되는 거죠.
그런데 여기서 주의할 것은 위의 코드에서 n의 자료형은 str이라는 것. 그러므로 다시 정수형으로 바꾸어 더해 주어야 합니다.
N=123
answer = 0
for n in str(N):
answer+=int(n)
print(answer)
이제 위의 내용을 프로그래머스에서 요구하는 함수 형태로 바꾸면 완성.
def solution(N):
answer = 0
for n in str(N):
answer+=int(n)
return answer
어때요? 참 쉽죠? ^^
형 변환을 사용하지 않는 방법
앞에서 이야기한 것처럼 다른 언어에서는 형 변환이 조금 불편할 수도 있습니다.
그래서 이번에는 형 변환을 사용하지 않는 방법을 소개하겠습니다.
이 방법의 핵심은 바로 나누기와 나머지입니다.
이렇게 이야기하면 눈치가 빠른 분들은 '123을 100으로 나눈 정수 몫은 1, 123을 10으로 나눈 나머지는 3...'
하고 어떤 방법이 떠올랐을 겁니다. 딩동댕.. 맞았습니다.
그런데 2는 어떻게 구해야 할까요?
123을 10으로 나눈 정수 몫은 12인데..
그러면 아까 얻은 100을 빼고 23에서 10으로 나누고... 어? 그런데 N이 4 자리면 어떻게 하지?....#$%^
대부분 이렇게 생각합니다.
설명하겠습니다.
방법은 뒤에서 한 숫자씩 갖고 오는 것입니다.
-
123을 10으로 나눈 나머지를 구합니다. >> 3 (변수에 더함)
-
123을 10으로 나눈 정수 몫을 구합니다. >> 12
-
12( 2. 의 결과 )를 10으로 나눈 나머지를 구합니다. >> 2 ( 변수에 더함)
-
12를 10으로 나눈 정수 몫을 구합니다. >> 1
-
1( 4. 의 결과 )을 10으로 나눈 나머지를 구합니다. >> 1 ( 변수에 더함)
방법을 차근차근 생각하며 이해하세요.
위의 각 스텝을 코드로 만들겠습니다.
먼저 정수 몫과 나머지를 구하는 연산자인 // 와 % 가 필요합니다. (코딩에서는 나머지 구하는 일이 은근히 많으니 % 연산자는 잘 기억해 두세요)
N=123
#1.
print(N%10)
#2.
N=N//10
print(N)
#3.
print(N%10)
#4.
N=N//10
print(N)
#5.
print(N%10)
'''
3
12
2
1
1
'''
반복되는 코드가 보이나요?
그러면 반복문이 필요하겠죠?
그런데 이번에는 for문보다는 while문이 좋습니다. 왜냐하면 숫자의 길이에 따라 반복 횟수가 달라지니까요.
반복문을 적용 후 함수로 나타내면 결과는 다음과 같습니다.
결과코드
def solution(N):
answer = 0
while(N>0):
answer+=(N%10)
N=N//10
return answer
오늘은 글이 길어졌네요..
늘 말씀드리지만, 어떤 방법이 좋다, 맞다 보다는 우선 다양한 방법을 접하길 바라는 마음에 두 가지로 올려 봤습니다.
오늘도 수고하셨습니다.
'파이썬 > 문제풀이' 카테고리의 다른 글
파이썬 - 프로그래머스 - 자연수 뒤집어 배열로 만들기 (0) | 2020.07.23 |
---|---|
파이썬 - 프로그래머스 - 약수의 합 (0) | 2020.07.23 |
파이썬 - 프로그래머스- 이상한 문자 만들기 (0) | 2020.07.21 |
파이썬 - 프로그래머스 - 나누어 떨어지는 숫자 배열 (0) | 2020.07.15 |
파이썬 - 프로그래머스 - 핸드폰 번호 가리기 (0) | 2020.07.10 |