πŸ”„ Algorithm/BaekJoon

μžλ°”(Java) [λ°±μ€€] 1110번 : λ”ν•˜κΈ° 사이클

kongmi 2023. 1. 15. 10:59

문제

0보닀 ν¬κ±°λ‚˜ κ°™κ³ , 99보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ λ‹€μŒκ³Ό 같은 연산을 ν•  수 μžˆλ‹€. λ¨Όμ € μ£Όμ–΄μ§„ μˆ˜κ°€ 10보닀 μž‘λ‹€λ©΄ μ•žμ— 0을 λΆ™μ—¬ 두 자리 수둜 λ§Œλ“€κ³ , 각 자리의 숫자λ₯Ό λ”ν•œλ‹€. κ·Έ λ‹€μŒ, μ£Όμ–΄μ§„ 수의 κ°€μž₯ 였λ₯Έμͺ½ 자리 μˆ˜μ™€ μ•žμ—μ„œ κ΅¬ν•œ ν•©μ˜ κ°€μž₯ 였λ₯Έμͺ½ 자리 수λ₯Ό 이어 뢙이면 μƒˆλ‘œμš΄ 수λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. λ‹€μŒ 예λ₯Ό 보자.

26λΆ€ν„° μ‹œμž‘ν•œλ‹€. 2+6 = 8이닀. μƒˆλ‘œμš΄ μˆ˜λŠ” 68이닀. 6+8 = 14이닀. μƒˆλ‘œμš΄ μˆ˜λŠ” 84이닀. 8+4 = 12이닀. μƒˆλ‘œμš΄ μˆ˜λŠ” 42이닀. 4+2 = 6이닀. μƒˆλ‘œμš΄ μˆ˜λŠ” 26이닀.

μœ„μ˜ μ˜ˆλŠ” 4λ²ˆλ§Œμ— μ›λž˜ 수둜 λŒμ•„μ˜¬ 수 μžˆλ‹€. λ”°λΌμ„œ 26의 μ‚¬μ΄ν΄μ˜ κΈΈμ΄λŠ” 4이닀.

N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, N의 μ‚¬μ΄ν΄μ˜ 길이λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 N이 μ£Όμ–΄μ§„λ‹€. N은 0보닀 ν¬κ±°λ‚˜ κ°™κ³ , 99보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 N의 사이클 길이λ₯Ό 좜λ ₯ν•œλ‹€.

 

처음 문제 봀을 λ•Œ ν•œ 접근은.. intλ₯Ό string으둜 λ³€ν™˜ν•œ ν›„ μͺΌκ°œμ„œ ..λ‹€μ‹œ int둜 ν˜•λ³€ν™˜μ„ ν•΄μ•Όν•˜λ‚˜? μ˜€λ‹€.
ν—ˆλ‚˜ μ΄λ ‡κ²Œ ν•˜λ©΄ λ°˜λ³΅λ¬Έμ„ ν•˜κΈ°κ°€ μ• λ§€ν•΄μ§€κ³ , μ½”λ“œκ°€ ꡉμž₯히 λ”λŸ¬μ›Œμ§„λ‹€.

ν•΄μ„œ κ²°κ΅­ μ €λ²ˆμ— 도움 λ°›μ•˜λ˜ κ·Έ λΈ”λ‘œκ·Έλ₯Ό λ‹€μ‹œ μ°Ύμ•˜λ‹€. (μ—¬κΈ°λ§Œν•œ 곳이 μ—†λ‹€ γ…œγ…œ)
이런 자릿수 κ΄€λ ¨λœ μ•Œκ³ λ¦¬μ¦˜μ€ %(λ‚˜λ¨Έμ§€)와 /(λͺ«)을 κ΅¬ν•˜λŠ” λ²•μœΌλ‘œ ν•˜λŠ”κ²Œ 베슀트인 것 κ°™λ‹€.

https://st-lab.tistory.com/42

 

[λ°±μ€€] 1110번 : λ”ν•˜κΈ° 사이클 - JAVA [μžλ°”]

https://www.acmicpc.net/problem/1110 1110번: λ”ν•˜κΈ° 사이클 0보닀 ν¬κ±°λ‚˜ κ°™κ³ , 99보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ λ‹€μŒκ³Ό 같은 연산을 ν•  수 μžˆλ‹€. λ¨Όμ € μ£Όμ–΄μ§„ μˆ˜κ°€ 10보닀 μž‘λ‹€λ©΄ μ•žμ— 0을 λΆ™μ—¬ 두 자

st-lab.tistory.com

1. μž…λ ₯받은 수λ₯Ό n에 μ €μž₯ int n = sc.nextInt(();
2. nκ³Ό 반볡문 돌린 ν›„μ˜ 값이 같은지 비ꡐ해야 ν•˜λ―€λ‘œ μƒˆλ‘œμš΄ λ³€μˆ˜ t에 n을 μ €μž₯ν•΄ λ†“λŠ”λ‹€. int t = n;
3. nκ³Ό tκ°€ 같을 λ•ŒκΉŒμ§€ λ¬΄ν•œλ£¨ν”„ λŒλ¦°λ‹€.
4. λͺ‡ 번 λŒμ•˜λŠ”μ§€ 좜λ ₯ν•΄μ•Ό ν•˜λ―€λ‘œ 루프 돌 λ•Œλ§ˆλ‹€ 횟수λ₯Ό μ„Όλ‹€.
int cnt = 0; 으둜 μ΄ˆκΈ°ν™” 해놓고 반볡문 μ•ˆμ—μ„œ 루프 돌 λ•Œλ§ˆλ‹€ 증가 cnt++;

이 λ•Œ κ°€μž₯ μ€‘μš”ν•œ 핡심은!
μž…λ ₯받은 n의 1의 μžλ¦¬λŠ” μ‹­μ˜ 자리둜 κ°€μ•Όν•˜κ³ , n의 각 자릿수λ₯Ό λ”ν•œ 값은 1의 자리둜 κ°€μ•Όν•œλ‹€λŠ” 것이닀.

예λ₯Ό λ“€μ–΄ n이 34인 경우,

1. 4λŠ” 40이 λ˜μ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ (34 % 10) * 10이 λœλ‹€.
즉, μ‹­μ˜ μžλ¦¬λŠ” (n % 10) * 10
2. κ·Έ λ‹€μŒ 각 자릿수λ₯Ό λ”ν•œ 값을 일의 자리둜 λ³€ν™˜ν•˜λŠ”κ²Œ 쑰금 κΉŒλ‹€λ‘œμš΄λ° 찬찬히 μƒκ°ν•˜λ©΄ 그리 μ–΄λ ΅μ§€ μ•Šλ‹€.
(3 * 10) + (4 * 1)λ₯Ό (3 * 1) + (4 * 1)둜 λ³€ν™˜ν•˜λ©΄ λœλ‹€.
=> (34 / 10) + (34 % 10) => 7
3. 1번 식과 2번 식을 λ”ν•˜κ³  κ·Έ 값이 t와 같을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄ 끝!

이 λ•Œ μ£Όμ˜ν•  점이 μžˆλ‹€.(μ€‘μš”)

λ­”λ°μš”;;;

2λ²ˆμ—μ„œ 각 자릿수λ₯Ό λ”ν•œ 값이 10을 λ„˜μ–΄κ°€λ©΄ κΈ°λŒ€ν•˜λŠ” 값이 μ•ˆλ‚˜μ˜€λ―€λ‘œ ν•œλ²ˆ 더 10으둜 λ‚˜λ¨Έμ§€λ₯Ό ꡬ해쀀닀.

예λ₯Ό λ“€μ–΄ 87인 경우,

2번 식 κ·ΈλŒ€λ‘œ μ μš©ν•˜κ²Œ 되면...

(87 / 10) + (87 % 10) = 8 + 7 = 15κ°€ λ‚˜μ˜¨λ‹€.

5κ°€ λ‚˜μ™€μ•Ό ν•˜λ―€λ‘œ ν•œλ²ˆ 더 10으둜 λ‚˜λ¨Έμ§€ 연산을 해주도둝 ν•˜μž.

 

자 그럼 이λ₯Ό κΉ”λ”ν•˜κ²Œ μ‹μœΌλ‘œ μΉ˜ν™˜ν•˜λ©΄..

n = ((n % 10) * 10) + (((n / 10) + (n % 10)) % 10)

 

λ‹€ μ™”λ‹€!!

이제 반볡문 μ•ˆμ— 가두고 n이 t와 κ°™μ•„μ§ˆ λ•ŒκΉŒμ§€ 돌리면 λœλ‹€.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int cnt = 0;
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int t = n;
        while(true) {
            n = ((n % 10) * 10) + (((n / 10) + (n % 10)) % 10);
            cnt++;
            if (t == n) break;
        }
        System.out.print(cnt);
    }
}

문제 μžμ²΄λŠ” κ°„λ‹¨ν•˜μ§€λ§Œ μƒˆλ‘œμš΄ 수λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μƒκ°ν•˜κΈ°κ°€ 쉽지 μ•Šμ•˜λ‹€.

κ·Έλž˜λ„ ν•˜λ‚˜ λ°°μ›Œκ°€λŠ” 점이 μžˆμ–΄μ„œ λΏŒλ“―ν•˜κ³ , 이 글을 λΉŒμ–΄ Stranger's lab λ‹˜μ—κ²Œ λ‹€μ‹œ ν•œ 번 κ°μ‚¬μ˜ 말씀을 μ˜¬λ¦°λ‹€.