ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BAEKJOON] 17614 369
    알고리즘 2023. 4. 29. 17:44
    반응형

    문제

    민수는 같은 반 친구들과 369게임을 하고 있다. 369게임은 여러 명이 원형으로 둘러 앉아 시작 위치의 사람이 1을 외치며 시작된다. 이후 시계방향으로 돌아가며 2, 3, 4와 같이 1씩 증가된 수가 자기 수가 된다. 순서대로 돌아오는 자기 수에 3, 6, 혹은 9가 포함되어 있지 않다면 그 수를 말해야 하며, 3, 6, 혹은 9가 포함되어 있으면 그 개수만큼 박수를 쳐야 한다. 이 규칙을 지키지 못하면 게임이 종료된다.

    민수는 369게임이 N까지 규칙을 지키며 진행된다면 그때까지의 들은 박수의 횟수 가 총 몇 번인지 궁금했다. 예를 들어 N = 14라면, 3, 6, 9, 13에서 각각 한 번의 박 수를 치게 되므로 총 4회의 박수를 듣게 될 것이다. N = 36이라면 3, 6, 9, 13, 16. 19. 23. 26. 29. 30. 31. 32. 33. 34. 35, 36에서 박수를 치게 되는데 33, 36에서는 각 각 두 번 박수를 쳐야 하므로 총 18회가 된다. 1 이상의 정수 N에 대하여 369게임을 N까지 규칙을 지키며 진행된다면 그때까지 듣게 되는 박수의 총 횟수를 계산하여 출력하는 프로그램을 작성하시오.

    입력

    첫 번째 줄에 정수 N이 주어진다 (1 ≤ N ≤ 106).

    출력

    박수의 총 횟수를 정수로 출력한다.

    서브태스크

    번호배점제한
    1 4 N은 14 또는 36
    2 5 1 ≤ N ≤ 10
    3 11 1 ≤ N ≤ 100
    4 38 1 ≤ N ≤ 10000
    5 42 원래의 제약조건 이외에 아무 제약조건이 없다.

     


    이 문제 같은 경우는 3,6,9 룰을 통해 횟수를 구하는 문제였다.

    그래서 순간 그냥 3, 6, 9 만 생각해서 3의 배수만 걸러내면 되겠다 싶었다가 

    앗차 싶었다

    13은 3의 배수가 아니다!

    그래서 처음에 접근한 방법은 입력한 n에 대해 반복을 돌려서 해당 값에 대해 3, 6, 9 가 존재하는지를 체크한 뒤에 1자리 보다 클 경우는 다시 반복을 돌려서 갯수를 세고 1의 자리일 경우 1개 밖에 없으니 +1 을 하는 코드를 작성하였다.

     

    n = int(input())

    ck = ['3', '6', '9']
    cnt = 0

    for i in range(1, n+1):
        sns = str(i)
        if(ck[0] in sns or ck[1] in sns or ck[2] in sns):
            if(len(sns) > 1):
                for s in sns:
                    if s in ck:
                        cnt += 1
            else:
                cnt += 1

    print(cnt)

    그러다가 더 좋은 방법이 생각 났는데

    10씩 나누면서 자리수를 줄여가면 횟수를 줄일 수 있을 것 같았다.

     

    def count(n):
        ret = 0
        while(n):
            print(n)
            if(n % 10 == 3 or n % 10 == 6 or n % 10 == 9):
                ret += 1
            n //= 10

        return ret

    어쩌피 n은 최대 10000 값이기에 4digit만 체크를 하면 된다.

    n 이 33333이 라면 %10을 통해 나머지 3값이 나오므로 1의 자리 값을 체크

    10을 나누면 3333값이 될 것이다.

    그렇게 자리 수를 마구잡이로 나누다보면 언젠간 n의 값은 0이 되어 while 반복문이 종료되어 나가게 될 것이다.

     

    def count(n):
        ret = 0
        while(n):
            print(n)
            if(n % 10 == 3 or n % 10 == 6 or n % 10 == 9):
                ret += 1
            n //= 10

        return ret

    n = int(input())

    cnt = 0

    for i in range(1, n+1):
        cnt += count(i)

    print(cnt)

    그렇게 작성된 마지막 코드

    반응형

    '알고리즘' 카테고리의 다른 글

    [BAEKJOON] 2606 바이러스  (0) 2023.05.19
    [BAEKJOON] 1260 DFS와 BFS  (0) 2023.05.17
    [BAEKJOON] 2178 미로 탐색  (0) 2023.05.14
    [BAEKJOON] 2667 단지번호붙이기  (0) 2023.05.14
    [BAEKJOON] 17615 볼 모으기  (0) 2023.04.30
Designed by Tistory.