새소식

Algorithm/파이썬 알고리즘 문제풀이 강의

[탐색&시뮬레이션] 2. 숫자만 추출

  • -

1. 문제

2. 내가 생각한 알고리즘

3. 내 코드

input_list = list(input()) #문자와 숫자가 섞인 문자열 입력 받음
new_list = [] #숫자만 추려서 넣는 리스트
final_list = []
start_index = 0
number = 0


def num_yaksoo(num):
    cnt = 0
    for i in range(1,num+1):
        if (num % i == 0):
            cnt+=1
    print(cnt)
    

for i in range (len(input_list)):
    #if(0 <= input_list[i]  <=9): #char와 int가 섞여있으니까 이러케 단순 조건x // isdigit이라는 함수 이용하자
    if input_list[i].isdigit():
        
        new_list.append(int(input_list[i])) #append로 추가 //단, int로 변환해야함

 
for j in range (len(new_list)):
    if(new_list[j]!=0):
        start_index = j
        break
#for k in range(start_index):
for k in range(start_index, len(new_list)):
    final_list.append(int(new_list[k])) #정수 넣기

max_degree = len(final_list) -1

for x in range(len(final_list)):
    number+= final_list[x]*pow(10,max_degree)
    max_degree -=1


print(number)
num_yaksoo(number)

4. 잘못한 점

  • '뒤집은 소수' 알고리즘 기억 못함....
  • 강의 코드보다 더더 길게 했다..

 

5. 잘한 점

  • 예전에 배운 약수count 알고리즘 잘 활용했당
  • 자릿수 하나하나 숫자를 가져와서, pow를 이용해서 합한 후, 하나의 자연수를 만드는 발상을 생각했다.

 

6. 강의 코드 + 설명

  • 첫 자리의 0은 무시한다 ex) 0,0,1,2 -> 120
  • '뒤집은 소수' 알고리즘 기억했어야 함.
s = input()
res = 0
for x in s: # x = g,0,e,n,2,T, ... 
    print(x,end=' ') #이제, x가 숫자인지만 확인하면 됨!
    if x.isdecimal() #isdecimal : 0부터 9까지만 찾아줌. #digit: 2^2, 등, 문자가 아닌 모든 숫자를 찾아줌
        res=res*10 + int(x) #x는 숫자인척 하는 문자이므로, int로 형변환!
        # 뒤집은 소수 알고리즘 참고
#for문이 끝나면, res는 0을 무시하고 28이 된다.

print(res)
cnt=0
for i in range(1,res+1):
    if res % i == 0:
        cnt +=1
print(cnt)

 

7. 아 맞다

  • 리스트에 원소를 추가할 때는?
    • 대입 연산자 '=' 가 아니라, 리스트이름. append(추가하려는 원소) !!
  • input()을  통해, 리스트 각각의 방에 원소를 넣을 때, 숫자를 입력했더라도, 그 숫자는 '문자' 이다.(input자체가 '문자열 입력')
    • 따라서, int로 형변환 꼭 해줘야함!
res = 0
if x.isdecimal() 
res= res*10 + int(x)  **기억**

-> x는 숫자인척 하는 문자이므로, int로 형변환!

# 뒤집은 소수 알고리즘 참고

 

8. 새로 알게된 내용

  • isdigit() : 2^2, 등, 문자가 아닌 모든 숫자를 찾아줌
  • isdecimal() : 0부터 9까지만 찾아줌. 
  • res= res*10 + int(x)  **기억**
 print(n, end='',sep='')
  • print 함수의 end 매개변수를 조정하여 행 바꿈 없이 한 줄로 읽을 수 있다.
  • 출력을 띄어쓰지 않고 한 줄로 읽고 싶다면? 
      - print 함수의 sep 매개변수를 활용하여 구분자를 지정할 수 있다.
       - sep 매개변수는 기본적으로 공백(' ')으로 설정되어 있지만, 이를 빈 문자열('')로 설정하여 출력값을 붙여서 한 줄로 읽을 수 있다.
  • 약수 구하는 코드에서, range의 범위 잘 생각하기
  •  
for i in range(1,res+1):
    if res % i == 0:
        cnt +=1
print(cnt)

-> res를 i로 나누는 연산을 하고 있으므로, i는 0이 되면 안된다. 따라서, range가 1부터 시작하게 했다.

 

-> res +1 로 닫은 이유는, res-1까지가 아니라, res까지 포함되도록 하기 위해서..!

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.