코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

[백준] 2526번 : 싸이클

2023. 11. 27. 14:46

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

 

2526번: 싸이클

두 자연수 N과 P를 가지고  다음 과정을 거쳐서 나오는 수를 차례대로 출력해보자. 처음 출력하는 수는 N이고, 두 번째 이후 출력하는 수는 N을 곱하고 P로 나눈 나머지를 구하는 과정을 반복하여

www.acmicpc.net

 

문제

두 자연수 N과 P를 가지고  다음 과정을 거쳐서 나오는 수를 차례대로 출력해보자. 처음 출력하는 수는 N이고, 두 번째 이후 출력하는 수는 N을 곱하고 P로 나눈 나머지를 구하는 과정을 반복하여 구한다. 즉, 먼저 N에 N을 곱하고, 이 수를 P로 나눈 나머지를 두 번째에 출력한다. 다음에는 이 나머지에 N을 곱하고 P로 나눈 나머지를 출력한다. 다음에는 이 나머지에 N을 곱한 후 P로 나눈 나머지를 출력한다. 이 과정을 계속 반복해보면 출력되는 에는 반복되는 부분이 있다. 

예를 들어서, N = 67, P = 31인 경우를 생각해보자. 처음 출력되는 수는 67이고, 두 번째로 출력되는 수는 67×67 = 4489를 31로 나눈 나머지 25이다. 다음에는 25×67 = 1675를 31로 나눈 나머지 1, 다음에는 1×67 = 67을 31로 나눈 나머지 5가 차례대로 출력된다. 다음에는 5×67 = 335를 31로 나눈 나머지 25가 출력되는데, 이 수는 이미 이전에 출력된 수이다. 이 과정을 그림으로 보이면 다음과 같다.


즉 이 과정을 반복하면, 처음 67을 제외하면 3개의 수 25, 1, 5가 계속 무한히 반복되게 된다.   또 다른 예로, N = 9, P = 3을 가지고 시작하면, 9×9 = 81이고 3으로 나눈 나머지는 0이며, 0×3 = 0이고 3으로 나눈 나머지도 0이기 때문에 처음 9를 제외하면 0이 무한히 반복되게 된다. 

N과 P를 입력받아 위와 같이 정의된 연산을 수행하였을 때,  반복되는 부분에 포함된 서로 다른 수의 개수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 처음 시작하는 두 자연수 N과 P가 공백을 사이에 두고 주어진다.

 

출력

첫째 줄에 반복되는 부분에 포함된 서로 다른 수의 개수를 출력한다.

 


소스코드

import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int p = Integer.parseInt(st.nextToken());

        int value = n;
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        while(true) {
            value = (value * n) % p;
            if(!set1.add(value)) {
                if(!set2.add(value)) break;
            }
        }

        bw.write(set2.size() + "");
        bw.flush();
    }
}

 

해결 방법

  1. 싸이클을 찾기 위해 계산된 값을 Set1에 저장한다.
  2. 저장에 실패한다면 이때부터 싸이클이 도는 것이다. 또 다른 Set2에 저장에 실패하는 값을 저장한다.
  3.  Set2에 저장에 실패한다면 싸이클을 도는 값을 모두 찾은 것이므로 Set2의 크기를 출력한다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 16234번 : 인구 이동  (1) 2024.01.14
[백준] 1715번 : 카드 정렬하기  (0) 2024.01.14
[백준] 15686번 : 치킨 배달  (2) 2023.11.26
[백준] 24524번 : 아름다운 문자열  (0) 2023.11.25
[Baekjoon] 28324번 : 스케이트 연습  (0) 2023.11.24
    '알고리즘/백준' 카테고리의 다른 글
    • [백준] 16234번 : 인구 이동
    • [백준] 1715번 : 카드 정렬하기
    • [백준] 15686번 : 치킨 배달
    • [백준] 24524번 : 아름다운 문자열
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바