barcode

배수 판별을 해보자

Coding/Python

왜 우리 초딩때 배웠던 배수 판별법 있죠? 짝수면 2의 배수, 끝자리가 5나 0이면 5의 배수, 자릿수 다 더해서 3의 배수이면 3의 배수 뭐 이런거. 그걸 해 볼거다. 솔직히 배수 판별이라고 해서 엥 그거 걍 나눠서 나머지 없으면 배수 아니냐 했던 분들 반성하십쇼. 그런 심플한거나 하겠답시고 내가 여기다 올리겠수?


https://ko.wikipedia.org/wiki/%EB%B0%B0%EC%88%98_%ED%8C%90%EC%A0%95%EB%B2%95

 

배수 판정법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 배수 판정법은 배수인지 확인하려는 수의 배수가 맞는지 간단히 확인하는 절차이다. 일반적으로 정수 m , n {\displaystyle m,n} 에 대해 m {\displaystyle m} 이 n {\displaysty

ko.wikipedia.org

여기 들어가보면 뭐가 많은데 우리는 1부터 9까지만 할거다. 두자리수부터는 솔직히 있는줄도 몰랐음.

 

2의 배수

2의 배수: 일의 자리 수가 0,2,4,6,8인 수이다.
import sys

K = sys.stdin.readline().rstrip()

if K[-1] == '2' or K[-1] == '4' or K[-1] == '6' or K[-1] == '8' or K[-1] == '0':
    print('2의 배수입니다. ')
else: 
    print('2의 배수가 아닙니다. ')

2의 배수는 말 그대로 끝자리가 2, 4, 6, 8, 0이면 2의 배수이다. 즉 짝수면 2의 배수다. 쉽죠? 5의 배수도 이따가 다시 설명하겠지만 로직은 비슷하고 끝자리가 5 혹은 0이기때문에 or 하나 들어가고 땡이다.

 

3의 배수

3의 배수: 각 자리 수의 합이 3의 배수인 수이다.

이거 사람은 둘째치고 컴퓨터 시켜먹을라면 빡세겠는데?

 

sum = 0
for i in K:
    sum += int(i)
print(sum)

근데 우리는 내일 쉬니까 해봅시다. 아무튼 숫자 자릿수를 다 더하는 방법은 이거다. 이거는 근데 그냥 다 더하는 방법이고... 우리는 이걸 다 더해서 3의 배수인지 아닌지 판단하는 절차를 거쳐야 한다.

 

import sys

K = sys.stdin.readline().rstrip()

sum = 0
for i in K:
    sum += int(i)

if sum % 3 == 0:
    print('3의 배수입니다')
else: 
    print('3의 배수가 아닙니다')

물론 가장 심플한 방법은 이거긴 함... 다 더한 값이 3으로 나누어 떨어지면 그건 3의 배수다. 예를 들어서 54는 5+4가 9이고 9가 3의 배수니까 3의 배수인 것. 쉽죠?

 

사실 하고싶었던 건 자릿수의 합을 구한 다음 그걸 또 더하고 더해서 최종 자릿수를 10 미만(한자리)으로 남긴 다음 판정하는건데 이거는 while 안에 for문 때려박으니까 로직 에러가 터진다. for+continue 해봤는데 처음으로 가기만 하고 실행 안함 잉잉…

 

4의 배수

4의 배수는 가장 끝에 두 자리수가 00이거나 4의 배수인 수이다. (십의 자리가 짝수인 경우에는 일의 자리수가 0, 4, 8이면 되고, 십의 자리수가 홀수인 경우에는 일의 자리수가 2, 6이면 된다.)

와씨 3 다음이 더 저세상이었어...

 

일단 첫번째 조건은 숫자가 세자리 미만(0~99)일 때는 판단 불가이므로 숫자 길이를 먼저 봐야 한다. 나머지는 뭐 두자리에서도 가능은 한데… or 붙이기 귀찮으니 걍 % 쓰겠음둥.

 

import sys

K = sys.stdin.readline().rstrip()

if len(K) > 2 and K[-2] == '00': # 해당 조건은 세자리 숫자부터 가능하다
    print('4의 배수입니다.')
elif int(K[-2]) % 2 == 0:
    if K[-1] == '0':
        print('4의 배수입니다.')
    if K[-1] == '4':
        print('4의 배수입니다.')
    if K[-1] == '8':
        print('4의 배수입니다.')
elif int(K[-2]) % 2 != 0:
    if K[-1] == '2':
        print('4의 배수입니다.')
    if K[-1] == '6':
        print('4의 배수입니다.')
else: 
    print('4의 배수가 아닙니다')

이때 아차 싶었던게 4의 배수가 아니면 출력이 안됨... 저기 else 보이죠? 지금 장식됐음 ㅋㅋㅋㅋㅋㅋ

 

import sys

K = sys.stdin.readline().rstrip()

if len(K) > 2 and K[-2] == '00': # 해당 조건은 세자리 숫자부터 가능하다
    print('4의 배수입니다.')
elif int(K[-2]) % 2 == 0 and K[-1] == '0':
    print('4의 배수입니다.')
elif int(K[-2]) % 2 == 0 and K[-1] == '4':
    print('4의 배수입니다.')
elif int(K[-2]) % 2 == 0 and K[-1] == '8':
    print('4의 배수입니다.')
elif int(K[-2]) % 2 != 0 and K[-1] == '2':
    print('4의 배수입니다.')
elif int(K[-2]) % 2 != 0 and K[-1] == '6':
    print('4의 배수입니다.')
else: 
    print('4의 배수가 아닙니다')

와 8의 배수 어카냐...

 

5의 배수

5의 배수는 일의 자리수가 5, 0인 수이다.

이거는 걍 위에 2의 배수 한 거 갖다 쓰면 된다.

 

import sys

K = sys.stdin.readline().rstrip()

if K[-1] == '5' or K[-1] == '0':
    print('5의 배수입니다. ')
else: 
    print('5의 배수가 아닙니다. ')

3, 4배수 거치고 나니 얘는 선녀가 따로 없다.

 

6의 배수

6의 배수는 2와 3의 공배수, 즉, 짝수이면서 각 자리의 합이 3의 배수인 수이다.
import sys

K = sys.stdin.readline().rstrip()

sum = 0
for i in K:
    sum += int(i)

if sum % 3 == 0 and int(K) % 2 == 0:
    print('6의 배수입니다')
else: 
    print('6의 배수가 아닙니다')

여기서 조심할건 3배수 갖다쓴답시고 sum % 2가 0일때로 걸면 안된다는 것. 우리가 입력하는 숫자가 짝수이면서 합계가 3의 배수인게 6의 배수지 합계는 홀수건 짝수건 상관 없다. 당장 36도 6의 배수인데 자릿수 다 더하면 9다.

 

7의 배수

7의 배수는 일의 자리를 두 배 한 것을 나머지 수에서 빼면 결과가 0 또는 7의 배수가 나오는 수이다. 다른 방법으로는 일의 자리부터 세 자리씩 끊어서 교대로 빼고 더한 것이 7의 배수일 경우 본래의 수도 7의 배수이다. 이 방법은 7이 1001의 약수임을 이용한 것으로 다른 1001의 약수 11, 13, 77, 91, 143, 1001에도 적용시키는 게 가능하다. 또 다른 방법으로는 본래의 수를 10으로 나눈 뒤에 소수점 아래는 버림한 값에 본래의 수의 일의 자리를 다섯 배한 수를 더한 결과가 7의 배수이면 본래의 수도 7의 배수이다.

이건 발견한 놈도 연구대상 아니냐... 이래서 초딩때 7의 배수만 판별법 안가르쳐주고 넘어갔구나...

 

자 일단 뭔 소리냐… 14를 예로 들어보면 일의 자리가 4니까 4*2를 1에서 빼면 음수긴 하지만 절대값이 어쨌든 7이니까 7의 배수 뭐 이런 식인 듯 한데… 솔직히 음수 어떻게 처리하는지는 저 방법 고안한 사람한테 물어봐야될 듯 하고요…

 

import sys

K = sys.stdin.readline().rstrip()

sum = 0
for i in range(len(K)-1):
    sum += int(K[i])

if abs(sum - int(K[-1]) * 2) % 7 == 0:
    print('7의 배수입니다.')
else: 
    print('7의 배수가 아닙니다.')

귀찮아서 절대값 때려박았음. 스펜터인지 스펜스인지 아무튼 이거 고안한 양반은 음수 처리를 어떻게 했는지 모르겠고… 이거는 걍 % 7 == 0으로 조건 거십쇼 그게 머리 안 터지고 좋은 방법입니다. 두번째 방법은 나도 이해를 못해서 못짜겠고 마지막 방법은… 35를 예시로 들자면 35/10은 3(소수점 버림)이고, 거기에 5*5 25를 더하면 28이 7의 배수이니까 35도 7의 배수! 이런 느낌인 듯 하다.

 

import sys

K = sys.stdin.readline().rstrip()

X = int(K) // 10
Y = int(K[-1]) * 5

if (X + Y) % 7 == 0:
    print('7의 배수입니다.')
else: 
    print('7의 배수가 아닙니다.')

근데 농담 아니고 막상 해놓고 보니 얘가 더 쉬운데?

 

8의 배수

8의 배수는 가장 끝에 세 자리수가 000이거나 8의 배수인 수이다. (좀 더 쉽게 설명하자면 백의 자리가 0이거나 짝수인 경우에는 끝에 두 자리수가 00, 08, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96 다시 말해 8의 배수인 수이고, 백의 자리가 홀수인 경우에는 끝의 두 자리수가 4의 배수면서 8의 배수가 아닌 두 자리수 4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92이어야 한다.)

야 이거 두자리 수는 그냥 8로 나누어 떨어지나 봐야긋다…

 

import sys

K = sys.stdin.readline().rstrip()

if len(K) <= 3 and int(K) % 8 == 0: # 이거 안 해주면 인덱싱 에러떠유
    print('8의 배수입니다.')
elif len(K) > 3 and K[-2] == '000': # 해당 조건은 네자리 숫자부터 가능하다
    print('8의 배수입니다.')
    # 여러분은 그냥 %를 쓰십시오... 아무튼 아래 조건은 1. 백의 자리가 짝수이면서 2. 십의 자리, 일의 자리가 8의 배수인 것들 
elif int(K[-3]) % 2 == 0 and K[-2:] == '00':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '08':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '16':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '24':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '32':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '40':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '48':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '56':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '64':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '72':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '80':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '88':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 == 0 and K[-2:] == '96':
    print('8의 배수입니다.')
    # 아래 조건은 1. 백의 자리가 홀수이면서 2. 십의 자리, 일의 자리가 4의 배수이면서 8의 배수가 아닌 것들(대충 초항이 4 공차가 8인 등차수열인데 범위가 < 100)
elif int(K[-3]) % 2 != 0 and K[-2:] == '04':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '12':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '20':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '28':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '36':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '44':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '52':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '60':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '68':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '76':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '84':
    print('8의 배수입니다.')
elif int(K[-3]) % 2 != 0 and K[-2:] == '92':
    print('8의 배수입니다.')
else: 
    print('8의 배수가 아닙니다')

누누이 말하는거지만 착한 코더 여러분들은 이런 노가다 하지 마시고 그냥 % 쓰십시오. 진지하니까 궁서체.

 

아, 참고로 4배수랑 달리 if문에 뭔가 이상한 게 들어갔는데, 저거 안 들어가면 두자리수 판별할 때 인덱싱 에러 뜬다. 십의자리, 일의자리랑 반복문땜시 입력을 텍스트로 받고 있는데 두자리수가 들어오면 인덱싱 범위 벗어난다고 안돼서 맨 위에 K(입력받은 수)가 두자리이고 8로 나누어 떨어지면 8의 배수 하셈 한 것. 4배수는 안해도 잘 돌아갔거나 내가 깜빡했거나 둘 중 하나다.

 

9의 배수

9의 배수는 각 자리 숫자의 합이 9의 배수인 수이다.
import sys

K = sys.stdin.readline().rstrip()

sum = 0
for i in K:
    sum += int(i)

if sum % 9 == 0:
    print('9의 배수입니다')
else: 
    print('9의 배수가 아닙니다')

걍 이걸로 퉁칩시다... 8배수 코딩하느라 기력 다빠졌어... ㅠㅠ

 

10의 배수

10의 배수는 일의 자리가 0인 수이다.
import sys

K = sys.stdin.readline().rstrip()

if K[-1] == '0' :
    print('10의 배수입니다')
else: 
    print('10의 배수가 아닙니다')

얘가 제일 쉬웠어요…

 

번외편: 11의 배수

11의 배수는 홀수 자리의 합과 짝수 자리의 합의 차가 0이거나 11의 배수인 수이다. 다른 방법은 일의 자리 숫자를 제외한 후 남은 숫자에 제외시킨 일의 자리 숫자를 뺀 결과가 0이거나 11의 배수이면 본래의 수도 11의 배수이다.

첫번째 방법은 숫자 길이가 정해져있으면 몰라도 숫자 길이가 가변형이면 난이도 급상승하니까 두번째 방법으로 해 보자. 솔직히 안하려고 했는데 재밌어보여서 하는거다.

 

import sys

K = sys.stdin.readline().rstrip()

X = int(K[-1])
Y = int(K[0:len(K)-1])

if (Y - X) % 11 == 0:
    print('11의 배수입니다.')
else: 
    print('11의 배수가 아닙니다.')

이거 n 이상 m 미만 아니었나 생각해봤는데 뒤에꺼 자르려면 길이에서 1 빼는게 맞더라...

 

결론: 그러니까 여러분은 이런 노가다 하지 마시고 걍 %를 쓰세요.