한걸음

백준 단계별로 풀어보기 (5) : 함수 본문

Coding Test

백준 단계별로 풀어보기 (5) : 함수

우당탕탕 할 수 있다!!! 2022. 11. 5. 19:48
반응형

 

https://www.acmicpc.net/step/5

 

함수 단계

함수를 구현해 봅시다. (이 문제는 C, C++, Python, Java, Go만 지원합니다. 그 외의 언어를 사용하신다면 이 문제를 무시해 주세요.)

www.acmicpc.net

 

1. 함수 구현 순서, 사고 전개 방식

 나는 프로그래밍에 있어서 함수 사용은 우리가 일상적인 대화를 서로 하는 것처럼 자연스러운 행동이어야 된다고 정의 내리고 싶다. 함수 활용을 잘할 수 있다면 내가 원하는 출력을 다양하고 간결하게 표현해낼 수 있기 때문이다. 그러므로 계속해서 연습할 수 있도록 하자. 

 또한, 단순히 함수를 구현할 수 있다고 해서 문제를 잘 풀 수 있는 것은 아니다. 결국 주어진 문제에 대해서 코드를 짤 때 적재적소에 함수를 갖다 놓을 수 있어야 한다. 그러므로, 문제를 구성하고 정리할 수 있는 습관도 필요하다. 문제를 해결할 때에는 가장 큰 숲에서 나무를 보는 방식으로 전개할 수 있도록 하자.

가령, 

  1. 조사해야 하는 집단을 파악하고, 하나씩 조사를 한다.
  2. 조건(1, 2, ..., N)을 확인하고, 그에 맞는 response를 구하자.
  3. 각 조건 (1, 2, ..., N)에 대해서 위와 같은 방식으로 고려를 하자.
  4. 최종 답을 구한다.

와 같다.

 어쩌면 계속해서 코딩 테스트에 낙방하는 것도 시간의 압박과 시험장에서의 적응이 느려서 그럴 수도 있겠지만, 사소하지만 필요한 작업이 제대로 이루어지지 않아서 그런 것 같기도 하다. 어쨌든, 계속해서 연습할 필요가 있다.

 

2. 문제 풀이

15596, 단순한 문제이므로 패스

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

 

15596번: 정수 N개의 합

C++17, Java 8, Python 3, C11, PyPy3, C99, C++98, C++11, C++14, Go, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

 

4673 : 셀프 넘버

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

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

문제를 정리해보자. 

  1. 10000 이하의 숫자에 대해서 하나씩 꺼내어 생성자가 있는지 판단한다.
  2. 생성자가 없다면 셀프 넘버이므로 출력을 한다.
  3. 생성자는 각 자리 숫자의 합을 구하여 판단할 수 있다.
  4. 이미 만들어진 숫자가 아니면 방문처리를 한다. 방문처리가 되어 있다면 넘어간다.

이 논리에 따른 코드는 다음과 같다.

visited = [False for _ in range(10001)]
def nonself():
    for i in range(1, 10001) : 
        total = i
        for elem in (str(i)) : 
            total += int(elem)
        if total <= 10000 :
            visited[total] = True
nonself()
for i in range(1, 10001):
    if not visited[i] : 
        print(i)

 

 

1065 : 한수

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

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나

www.acmicpc.net

문제를 정리해보자.

  1. 숫자의 간격이 등차수열을 만족하는 경우는 한수이므로 count 하자
  2. 숫자를 자릿수 단위로 분해를 해서 등차수열인지 확인하자
  3. 이때, 한 자릿수의 경우는 등차 수열이다. 공차가 0이기 때문이다.

이 논리 구조에 따른 코드는 다음과 같다.

def is_cond(n):
    # 각 숫자의 간격을 조사하자
    _list = list(map(int, str(n).strip()))
    if len(_list) == 1 : 
        return True
    else : 
        dist = _list[0] - _list[1]
        for i in range(1, len(_list)-1):
            if dist != _list[i] - _list[i + 1]:
                return False
    return True

N = int(input())

# 첫 번째로 짠 코드
cnt = 0 
for i in range(1, N + 1):
    if is_cond(i) : cnt += 1

print(cnt)

 간단한 문제였지만, 천천히 생각해보기에는 좋은 문제였던 것 같다. 앞으로도 이렇게 연습할 수 있도록 하자!

반응형