[BOJ / Python] 16680번: 안수빈수

hurrydisc·2025년 3월 23일

PS

목록 보기
4/20

문제: BOJ 16680번

자릿수의 합이란 무엇인가? 이는 수를 10진수로 나타내었을 때, 각 자리 숫자들의 합을 의미한다. 예를 들어, 1093의 자릿수의 합은 1 + 0 + 9 + 3 = 13이다.

우리는 자릿수의 합이 짝수인 양의 정수를 수빈수라고 부르기로 했다. 그리고 수빈수가 아닌 양의 정수를 안수빈수라고 부르기로 했다.

어떤 양의 정수 N이 주어졌을 때, N의 배수 중 안수빈수가 있는지 확인하고, 있다면 아무거나 하나를 출력하는 프로그램을 작성하시오.

입력: 첫 번째 줄에 테스트케이스의 개수 T가 주어진다. (1 ≤ T ≤ 1,000)
두 번째 줄 부터 T개의 줄에 걸쳐, 각각의 테스트 케이스에 대한 N이 주어진다. (1 ≤ N ≤ 100,000,000)

출력: 각 테스트 케이스에 대해 매 줄마다 아래와 같이 출력한다.
N의 배수 중 안수빈수가 없다면 -1을 출력한다.
N의 배수 중 안수빈수가 있다면, 그 중 10^18 이하의 안수빈수를 아무거나 하나 출력한다.
100,000,000 이하의 양의 정수 N에 대해, N의 배수 중 안수빈수가 있다면, 그 중 10^18 이하의 안수빈수가 존재함이 보장된다고 생각해도 좋다.

풀이

난이도가 플레 5라서 상당히 어려워 보이는 문제이다. 근데 정말 간단한 아이디어를 떠올린다면 실버 5급 문제라고 볼 수 있다.
안수빈수는 자릿수의 합이 홀수인 숫자이다. 그렇다면? 먼저 수빈수. 자릿수의 합이 짝수인 숫자를 생각해보자.

1393 (16)은 수빈수이다. 1393에 2를 곱하면 2786(23)이다. 바로 안수빈수가 나왔다.
수빈수인 경우는 2를 계속 곱하다 보면 5 이상의 숫자들은 다음 자릿수로 올라가는 '1'이 있을 것이다. 이 1의 갯수가 홀수라면, 짝수였던 자릿수의 합에 홀수가 더해지며 홀수가 된다. 계속계속 2를 곱하다 보면, 이러한 경우가 과연 없을까? 무조건 하나쯤은 나오지 않을까?

이러한 아이디어를 토대로 코드를 짜서 제출을 해봤다.

최종코드

n=int(input())

def asbs(a):
    return sum([int(i) for i in str(a)])%2
    
for _ in range(n):
    a=int(input())
    while asbs(a)==0: a*=2
    print(a)

진짜 코드가 이게 끝이다. ez하죵?

근데 이거 맞나 싶어서 구글에 검색을 해봤는데요
그냥 a입력받고 10^9-1을 곱하면 그게 무조건 안수빈수라네요..??????????

이 블로그에서 접근법을 읽어보았는데요... 문제는 이걸 의도한 거라서 난이도가 플레5인걸까요..?
나는 그냥 날로먹은거고..?? 저거 진짜 읽어보세요 나는 멍청이였음

일단 모르겠고 애드혹문제가 참 재밌네요

profile
허리아픈사람

0개의 댓글