πŸ”„ Algorithm/etc

μžλ°”(Java) - λ”ν•˜κΈ° 사이클

kongmi 2023. 2. 6. 18:51

ν•΄λ‹Ή λ¬Έμ œλŠ” λ°±μ€€ 1110번 문제이고, λΈ”λ‘œκ·Έμ—λ„ μ˜¬λ Έμ—ˆλŠ”λ° 였늘 κ°•μ‚¬λ‹˜κ»˜μ„œ 이 문제λ₯Ό λ‚΄μ£Όμ…”μ„œ!

μ˜€λžœλ§Œμ— λ‹€μ‹œ ν•œ 번 더 ν’€κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

λΈ”λ‘œκ·Έμ— 올릴까 말까 ν–ˆλŠ”λ°, λ‚˜λ¦„μ˜ 또 μ‹œν–‰μ°©μ˜€κ°€ μžˆμ–΄μ„œ λ³΅κΈ°ν•˜κ³ μž μ˜¬λ €λ΄…λ‹ˆλ‹€.


1. λ¬Έμ œ

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의 μ‚¬μ΄ν΄μ˜ 길이λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

2. μž…λ ₯

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

3. μΆœλ ₯

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


첫 번째 μ½”λ“œ

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int cnt = 0;
        ArrayList<Character> numArr = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        String num = sc.next();
        for (int i = 0; i < num.length(); i++) {
            if (num.length() == 1) {
                for (int j = 0; j < 2; j++) {
                    numArr.add(0, '0');
                    numArr.add(1, num.charAt(i));
                    break;
                }
            } else numArr.add(num.charAt(i));
        }
        while(true) {
            int a = (int) (numArr.get(0) - '0');
            int b = (int) (numArr.get(1) - '0');
            int c = a + b;
            int d;
            if (c < 10) {
                d = (b * 10) + c;
            } else d = (b * 10) + (c % 10);
            numArr.clear();
            numArr.add((char) (d / 10 + (int) '0'));
            numArr.add((char) (d % 10 + (int) '0'));
            cnt++;
            if(((int)numArr.get(0) - '0') * 10 + ((int)numArr.get(1) - '0') % 10 ==
                    ((int)num.charAt(0) - '0') * 10 + ((int)num.charAt(1) - '0') % 10) break;
        }
        System.out.println(cnt);
    }
}

🀐 인간은 μ™œ λ˜‘κ°™μ€ μ‹€μˆ˜λ₯Ό ν•˜λŠ”κ±ΈκΉŒ.

μ €λ²ˆμ—λ„ String으둜 λ°›μ•„μ„œ 문제λ₯Ό μ–΄λ ΅κ²Œ κΌ¬λ”λ‹ˆ

μ΄λ²ˆμ— 또 String으둜 λ°›μ•„μ„œ μ½”λ“œλ₯Ό λ”λŸ½κ²Œ μ§°λ‹€. (와이라노 와이라노

κ°€λ§Œνžˆ μ§€μΌœλ³΄λ‹€κ°€ ꡳ이 이럴 ν•„μš”κ°€ μ—†μ–΄μ„œ λŒ€ν­ μˆ˜μ •ν–ˆλ‹€.

 

두 번째 μ½”λ“œ

import java.util.ArrayList;
import java.util.Scanner;

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

πŸ€“ μ—¬κΈ°μ„œ μ€‘μš”ν•œκ±΄ tmp에 num 값을 λ„£μ–΄μ€˜μ•Ό whileλ¬Έ νƒˆμΆœν•  수 μžˆλ‹€.
     (num은 계속 값이 λ°”λ€Œλ‹ˆ 쑰건문에 num으둜 λ„£μœΌλ©΄ μ˜μ›νžˆ λͺ» λΉ μ Έ λ‚˜μ˜΄!)