Ssa!

백준 알고리즘 단계별)함수 본문

CS/알고리즘

백준 알고리즘 단계별)함수

Ssa! 2022. 9. 8. 00:54

https://www.acmicpc.net/problem/1065

문제 정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.
  • Python 2, Python 3, PyPy, PyPy3: def solve(a: list) -> int
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 리스트 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • 리턴값: a에 포함되어 있는 정수 n개의 합 (정수)
입력  
출력  
def solve(a):
    return sum(a)

함수의 사용방법을 알려주는 그런 문제였다! 간단간단 저것 말고도 한개 더 있는데

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

반복문으로 돌려 합계에 넣는 것이다!

 

https://www.acmicpc.net/problem/4673

문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력
입력은 없다.
 
출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
num_1 = [x for x in range(1, 10001)]
num_2 = []
for i in num_1:
    if i < 10:
        a = i * 2
        num_2.append(a)
    elif i < 100:
        b = str(i)
        c = int(b) + int(b[0]) + int(b[1])
        num_2.append(c)
    elif i < 1000:
        d = str(i)
        e = int(d) + int(d[0]) + int(d[1]) + int(d[2])
        num_2.append(e)  
    elif i < 10000:
        f = str(i)
        g = int(f) + int(f[0]) + int(f[1]) + int(f[2]) + int(f[3])
        num_2.append(g)
    else:
        h = str(i)
        j = int(h) + int(h[0]) + int(h[1]) + int(h[2]) + int(h[3]) + int(h[4])
        num_2.append(h)     
num_3 = sorted(set(num_1) - set(num_2)) 
print(*num_3, sep='\n')

처음보는 긴 문제에 당황스러웠다. 문제가 이해가 되지않아 튜터님에게 도움을 요청하고 어떻게 풀어나가야하는지 흐름을 알려주셨다. 셀프넘버를 출력하라고 하여 생성자로 덧셈이 되는 수식을 각 리스트에 넣어 해당하는 조건문에 다 덧셈해주고 새로운 리스트에 담아 마지막에 차집합으로 쓴다음 출력되게 했다.  나에게 부족한 것은 문제 해결능력 뿐만이 아니라 문제 독해 능력도 부족한 것 같다. 앞으로 문제를 제대로 읽고 이해하려는 연습을 해야겠다. 그리고 튜터님이 하신 정답 코드를 봤는데 놀라웠다.  i를 문자열로 변경하여 그 해당하는 것을 정수로 바꾸어 각각 더한다는 점이. . .엄청 놀랬다. remove라는 함수도 쓰는 것도 보여주셨고 아직 많이 부족한 것 같다. 그래도 코드를 보니 흐름은 이해가 되었다. 계속 복습하면서 내것으로 만들자!!!!

result = [x for x in range(1, 10001)]

for i in range(1, 10001):
    j = i + sum([int(x) for x in str(i)])
    try:
        result.remove(j)
        
    except:
        pass
    
print(result)

https://woodforest.tistory.com/157

 

[DP] 셀프 넘버 self number

셀프 넘버 * 넥슨 입사 문제 중 가장 쉬운 문제라고도 알려진 내용이라고 합니다. 1949년 인도 수학자 D.R. Kaprekar가 이름 붙인 셀프 넘버란? 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는

woodforest.tistory.com

 

https://www.acmicpc.net/problem/1065

문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 
 
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
 
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
n = int(input())
hansu = 0
for i in range(1, n+1):
    a_list = list(map(int, str(i)))
    if i < 100: # 1 ~ 99는 비교할 대상이 없어 등차수열!
        hansu += 1
    elif a_list[0]- a_list[1] == a_list[1] - a_list[2]: # 100의 자릿수 부터 비교하여 더하기!
        hansu += 1
print(hansu)

이 문제 또한 문제의 이해가 되지않아 전체적인 흐름과 문제를 튜터님에게 물었다. 일의 자리 숫자와 십의 자리 숫자는 비교할 대상이 없으므로 한수이며 적어도 세자리 수 부터 비교할 대상이 생겨 한수를 카운터 한다 리스트로 인덱스를 받아 앞과 뒤의 차가 같은지 즉 공차가 같은지 비교하여 같으면 카운트 해주는 식이다.

 

정말 이번 함수 문제를 풀면서 아주많이!!!!! 복습해야 한다는 것을 느꼈다. 

일주일 동안 알고리즘을 푸니 어느정도 감이 잡히며 슬슬 익숙해져간다.비교하자면 처음에는 큰 정글 숲을 봤는데 이제는 나무를 한 개씩 타면서 마치 타잔처럼 덩굴을 이리저리 타며 전체적인 흐름을 알 수 있는 것 같다. 그리고 매번 풀때는 새로웠는데 문제의 량이 많아지니 패턴도 어느정도 보인다.  언젠가는 타잔이 아니라 원숭이처럼 숲을 헤쳐나가고 싶다. 

복습 파이팅!!!!!