[Python] 코딩 도장 - Light More Light

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: Light More Light] - Lv.2

우리 학교에는 복도 불을 켜고 끄는 마부(Mabu)라는 사람이 있다.

전구마다 불을 켜고 끄는 스위치가 있다.

불이 꺼져 있을 때 스위치를 누르면 불이 켜지고 다시 스위치를 누르면 불이 꺼진다.

처음에는 모든 전구가 꺼져 있다. 마부라는 사람은 특이한 행동을 한다.

복도에 n개의 전구가 있으면, 복도를 n번 왕복한다. i번째 갈 때 그는 i로 나누어 떨어지는 위치에 있는 스위치만 누른다.

처음 위치로 돌아올 때는 아무 스위치도 건드리지 않는다.

i번째 왕복은 (이런 이상한 행동을 하면서) 복도를 한 번 갔다가 오는 것으로 정의된다. 마지막 전구의 최종 상태를 알아내자.

과연 그 전구는 켜져 있을까 아니면 꺼져 있을까?

Input

복도에 있는 n번째 전구를 나타내는 숫자가 입력된다. (2^32-1 이하의 정수가 입력된다.)

0은 입력의 끝을 의미하며 그 값은 처리하지 않는다.

Output

그 전구가 켜져 있으면 “yes”를, 꺼져 있으면 “no”를 출력한다. 테스트 케이스마다 한 줄에 하나씩 출력한다.

Sample Input

3
6241
8191
0

Sample Output

no
yes
no

출처: https://codingdojang.com/scode/429?answer_mode=hide


[풀이]

n = 1
lst = []

while True:
    n = int(input())
    cnt = 0
    
    if n == 0:
        for i in lst:
            print(i)
        break
        
    for i in range(1,n+1):
        if n % i == 0:
            cnt += 1

    if cnt % 2 == 0:
        lst.append("no")
    else:
        lst.append("yes")
        
    cnt=0
3
6241
8191
0
no
yes
no

마지막 전구의 on/off만 확인하므로 문제의 의도는 n의 약수의 갯수가 짝수이냐 홀수이냐이다.

for문을 통해 약수의 갯수를 모두 더해서 짝수이면 no 홀수이면 yes를 출력하게 만들었다.


[추천 풀이]

1의 약수={1} → 홀수개(on), 2,3,5,7,11 등 1과 자신만을 약수로 가지는 수(소수) → 짝수개(off)

12의 약수={1,2,3,4,6,12} → 짝수개(off), 15의 약수={1,3,5,15} → 짝수개(off)

16의 약수={1,2,4,8,16} → 홀수개(on), 25의 약수={1,5,25} → 홀수개(on)

즉, 1 4 9 16 25 36 49 ... 등 어떤 수의 제곱수(m^2)만이 홀수개의 약수를 가집니다 → (on)

입력된 값 n이 어떤 수의 제곱인지 확인하면 됩니다. 

다른 분이 올려주신 글인데 약수의 갯수를 파악하는데 있어서 한번 더 생각한 것이 보인다.

이 같은 논리론 다음과 같이 풀 수 있다.

while 1:
    n = int(input())
    if n == 0:
        break
    print('yes' if n**0.5 % 1 == 0 else 'no')
3
no
6241
yes
8191
no
0

아주 간결하게 풀린다.

Leave a comment