함수는 문제가 3개밖에 없어서 기분이 좋았다 ㅋㅋㅋ
오늘이 일요일이라서 3문제만 주는건가 괜히 가벼운마음으로 시작했는데
첫번째 문제를 클릭하자마자

.....??응...??? 뭐지이건...? 노트북 그냥 닫고 쉴까...?
싶었다^^ 하핫

그래도 시작!!!

[15596]
순간 당황스럽긴 하지만 말 그대로 for문을 이용해서 list a에 있는 정수 n까지의 합을 만들어주면 되기 때문에 PASS~
이미 기본 소스코드가 처음부터 제공되기 때문에 수정해서 작성하면 된다(단, 주어진 단어(또는 이름)을 수정하면 안됩니다!)

def solve(a):
    ans = 0
    for i in a:
        ans = ans + i
    return ans

[4673]

: 휴우 어려웠다 그냥 안풀고 노트북 닫을뻔... ㅋㅋㅋ

일단 최종적으로 2가지(?) 방법으로 풀 수 있었다
차이점으로는 파이썬이 푸는 속도에서 7배 넘게 빠르게 처리되었기 때문에 1번 풀이법을 권장한다 (코드가 짧아서 2번이 더 좋을줄 알았는데 속도는 1번이 빨라서 신기했다)

1번째 방법

def d(n):             
    s = n            
    str_n = str(n)   
    for i in str_n:   
        s = s + int(i)
    return s
    
a = list(range(1,10001))
b = []
for k in a:
    b.append(d(k))
a = set(a)
b = set(b)
a = a - b
a = list(a)
a.sort()
for l in a:
    print(l)

1) 일단 d(n)이라는 이름의 함수를 정의한 후
자리 수 별로 숫자를 쪼갠 후 다 더해서 결과값을 주는 for문을 만들어준다
: 원래 숫자 n을 str()함수에 넣어 문자로 바꿔서 str_n변수에 넣어준 후 아래와같은 for문의 조건을 추가해준다

모두 더해진 결과값(->s) = 처음 숫자(->s) + int(i)(->처음 입력한 숫자를 문자형으로 쪼개서 추출한 각 자리 수의 숫자)

위 함수와 조건을 이해할 때 중요한 Tip은!!

  • str()함수는 숫자를 문자로 바꿔주는 함수이지만 (ex. 1 -> '1')
    동시에 list처럼 각 문자의 위치에 자리값이 있어서 쪼개서 내용을 받을 수 있는 특징이 있는 부분을 활용할 수 있습니다 (ex. a = '1234' --> a[0]=1, a[1]=2 )
    때문에 str(n)을 통해 원래 숫자를 자리 수 별로 쪼개서 추출할 수 있습니다.

  • str()을 통해 문자로 받은 숫자를 다시 int(i)로 정수로 만들어서 원래 숫자(s)와 더해 모두 더해진 값을 추출할 수 있습니다.

위 계산이 완료 된 후
2) 1부터 10000까지의 돌아가는 list를 a라는 이름으로 선언해준 후
리스트 a의 내용을 d()함수에 넣은 값을 비어있는 b리스트에 넣어줍니다
이렇게 되면 셀프 넘버가 아닌 수 만 list b에 들어가게 됩니다.

3) 1부터 10000까지의 돌아가는 list를 a에서 셀프 넘버가 아닌 list b를 빼주면 우리가 원하는 셀프 넘버만 추출할 수 있습니다.
단, 리스트끼리 '-'연산자를 사용할 수 없어서 "a = set(a)"처럼 a list를 집합 함수인 set()로 다시 선언을 해 준 후 '-'연산자로 빼주면 됩니다.

4) 위 3)번까지 끝낸 후 for문으로 그대로 출력해주면 완성이긴 하지만
1부터 10000까지 순서대로 출력되지 않는 문제가 있어 오름차순으로 보여주는 sort()함수를 a에 적용해주면 진짜 끝입니다!!
sort()함수는 sort(a)로 쓰는게 아니라! a먼저 선언한 후 sort()로 사용하면 됩니다
(ex. a.sort())

2번째 방법

def d(n):
    s = n
    str_n = str(n)
    for i in str_n:
        s = s + int(i)
    return s
    
a = list(range(1,10001))
b = []
for k in a:
    b.append(d(k))

for l in a:
    if l not in b:
        print(l)

1번째 방법과 동일하지만 3)번의 '-'연산자를 사용하기 위해 set()로 선언하고, 순서대로 추출하기 위해 .sort()함수로 선언했던 것을 'if not in '으로 대체해서 사용할 수 있습니다만 출력까지 소요되는 시간이 7배 정도..... 더 증가합니다
왜 그런지는..... 저도 좀 더 컴퓨팅 관련해서 공부를 해봐야할 것 같습니다ㅜㅜ
메모리 연산 관련된게 아닐까싶은데 알고계시다면 댓글....로 알려주시면 공부하겠습니다^^

[1065]

:
일단 최종적으로 2가지(?) 방법으로 풀 수 있었다

1번째 방법 : for문으로 푸는 법

  • 입력받는 n값은 정수로 정의해주고
  • 구해야하는 한수 개수는 count로 정의해주었다

이후 for문을 이용해서 100이하인 경우 결국 2자리 숫자이기 때문에 무조건 등차수열을 이루어 count에 +1을 해주는 구문을 작성하고
그 외에는 n+1까지 받는 i라는 숫자를 list k로 선언해준 후 앞자리의 차이와 뒷자리 차이가 같을 경우 count를 1을 해준다
( 1000보다 작은 숫자이기 때문에 k[0],k[1]와 k[1],k[2]의 차이를 비교해서 총 3자리 수를 비교하게 되는데 10000보다 작은 숫자일 경우 조건을 추가해줘야한다)

이후 count를 print해주면 정답이다!

n = int(input())
count = 0

for i in range(1, n+1):
    k = list(map(int,str(i)))
    if i < 100:
       count += 1
   	else :
       if k[0]-k[1] == k[1]-k[2] :
       count +=1
print count

2번째 방법 : def로 정의해서 푸는 법
: 1번 for문으로 푸는 방법과 동일하지만 !!!
나도 한참 이유를 찾다가 br덕분에 알게되었는데
def정의를 했을 경우엔 count를 정의 안쪽에 작성해줘야한다!!!

count가 def 밖에 선언되었을 경우
hansu(a)를 정의하고 if문에 따라 count가 10이 되었다고 가정했을 때
다시 다른 숫자가 들어와서 if를 지나쳐 else까지 갈 때 count=0부터 카운트가 되어야하는데 10부터 count가 되어 잘못 카운트 될 수 있기 때문이다
또한, count자체를 def정의 안쪽 구문에서 정의했기 때문에 def구문 안쪽에 선언해야하는 이유도 있다

n = int(input())

def hansu(a):
    count = 0
    for i in range(1, a+1):
        k = list(map(int,str(i)))
        if i < 100:
            count += 1
        else :
            if k[0]-k[1] == k[1]-k[2] :
                count +=1
    return count
print(hansu(n))

함수 처음해봤더니 너무 어렵다는 것이 첫 소감......

profile
ɪ ʜᴏᴘᴇ ᴛᴏ sᴏʟᴠᴇ ʀᴇᴀʟ ᴘʀᴏʙʟᴇᴍs👩🏻‍💻❤️

0개의 댓글