풀 수 있는 방법은 여러가지다.

1. factorial을 직접 재귀함수로 만들어서 계산

2. import math as m 로 m.factorial(n)을 활용하여 계산

3. 인수 중 2와 5의 개수를 찾아내서 계산

4. 단순히 5의 개수를 찾아내서 계산(입력 값의 범위가 적기 때문에 가능)

 

- 전체적으로 pypy3가 아닌, python3로 제출해야 메모리초과가 뜨지 않는다는 것을 알 수 있었다.

: pypy3가 메모리를 정말 많이 잡아먹는구나! 이 둘의 차이점을 조금 더 공부해야할 것 같다.

- 인덱싱에서 뒤에서부터 숫자를 비교할 때, for문의 range를 -1를 걸어서 거꾸로 찾는게 아니라, 그냥 -i로 소환해버리는 마이너스 인덱싱 방법을 배웠다.

1. factorial을 직접 재귀함수로 만들어서 계산
import sys

sys.setrecursionlimit(10**6)
input=sys.stdin.readline

n=int(input())

def factorial(x):
    if x == 0 or x == 1:
        result = 1
        return result
    elif x > 0:
        result = x * factorial(x-1)
        return result
    else:
        print('프로그램을 다시 실행해주세요')
        
sep_n=list(str(factorial(n))) #n! 계산값을 문자열로 바꾸어서 리스트로 넣는다.

cnt=0

for i in range(1, len(sep_n)+1):
    if sep_n[-i]=='0': #-1부터 ~-길이 만큼, 뒤에서부터 0이 있으면 개수 카운트
        cnt+=1
    else:
        break
        
print(cnt)

 

2. import math as m 로 m.factorial(n)을 활용하여 계산

위의 코드보다 길이가 짧아지는 것을 알 수 있다.

import sys
import math as m

sys.setrecursionlimit(10**6)
input=sys.stdin.readline

n=int(input())
sep_n = list(str(m.factorial(n)))

cnt=0

for i in range(1, len(sep_n)+1):
    if sep_n[-i]=='0': #-1부터 ~-길이 만큼, 뒤에서부터 0이 있으면 개수 카운트
        cnt+=1
    else:
        break
        
print(cnt)

 

3. 인수 중 2와 5의 개수를 찾아내서 계산
import sys
import math as m

sys.setrecursionlimit(10**6)
input=sys.stdin.readline

n=int(input())

N1=m.factorial(n)
N2=m.factorial(n)

cnt=0
while(N1>=5):
    if N1 % 5 == 0 :
        N1=N1//5
        cnt+=1
    else:
        break

cnt2=0
while(N2>=2):
    if N2 % 2 == 0:
        N2=N2//2
        cnt2+=1
    else:
        break

print(min(cnt,cnt2))

 

4. 단순히 5의 개수를 찾아내서 계산(입력 값의 범위가 적기 때문에 가능)
#5의 개수를 찾으면 된다. 0이 늘어나는 순간은 10이 곱해지는 순간이기 때문.
#해당 범위 내에서는 5가 생기는 순간에서 2의 개수는 당연히 5의 개수보다 많기 때문에 이렇게 되는 듯.
N=int(input())
print(N//5 + N//25 + N//125)

1. 버전 업그레이드

n, nvm으로 올리면

node로 명령어를 실행했을 경우와

/user/local/bin/node 간의 명령어가 꼬이는 경우가 발생할 수 있다고 한다. 이 경우 EACCES가 발생할 수 있다.

*EACCES : npm install 시 permission denied 발생 가능

 

따라서 기존의 모든 node를 지우고, curl로 node를 직접 받는 것이 낫다.

#node 설치 장소 확인
whereis node

# node 관련 모든 경로 삭제
rm -rf /usr/bin/node


#윈도우 명령어
sudo apt-get remove nodejs
sudo apt-get remove npm

mac 이면 위에 2개 입력하고, 홈페이지가서 직접 설치하면 됨.

https://nodejs.org/download/release/v18.17.1/

 

Index of /download/release/v18.17.1/

 

nodejs.org

apt-get: command not found 오류뜨면 아래방식으로

#윈도우
sudo yum remove <package이름>

 

https://ondemand.tistory.com/176

mac os에서는 apt-get이나 yum이 없다. 이것의 대체가 homevrew.

 

참고한 블로그. 상세하게 나와있는데 아직 모르는 내용이 많다. 차근히 공부해보자.

https://velog.io/@djunnni/Node.js-12%EC%97%90%EC%84%9C-16%EB%A1%9C-%ED%95%9C%EB%B2%88%EC%97%90-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EC%A0%81%EC%9A%A9%ED%9B%84%EA%B8%B0-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85%ED%8E%B8\

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