π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_μˆ˜ν•™&κ΅¬ν˜„

[Baekjoon/λ°±μ€€][1110][C/C++] λ”ν•˜κΈ° 사이클

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 1. 17.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

숫자 μ‚¬μ΄ν΄μ˜ μ›λ¦¬λ§Œ κΉ¨λ‹¬μœΌλ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” 문제. 그림으둜 직접 사이클을 κ·Έλ €κ°€λ©° ν‘ΈλŠ” 방식이 이해가 κ°€μž₯ 빨랐던 것 κ°™λ‹€.

1. 문제

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

 

1110번: λ”ν•˜κΈ° 사이클

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

www.acmicpc.net

[문제]

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의 사이클 길이λ₯Ό 좜λ ₯ν•œλ‹€.

[예제 μž…λ ₯ 1]

26

[예제 좜λ ₯ 1]

4

[예제 μž…λ ₯ 2]

55

[예제 좜λ ₯ 2]

3

[예제 μž…λ ₯ 3]

1

[예제 좜λ ₯ 3]

60

[예제 μž…λ ₯ 4]

0

[예제 좜λ ₯ 4]

1

[예제 μž…λ ₯ 5]

71

[예제 좜λ ₯ 5]

12

2. 풀이

μ‚¬μ΄ν΄μ˜ 원리λ₯Ό 그림으둜 그렀보면 λ‹€μŒκ³Ό κ°™λ‹€.

λ°±μ€€ 1110 λ”ν•˜κΈ° 사이클
λ°±μ€€ 1110 λ”ν•˜κΈ° 사이클

μœ„ 사이클을 μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄, μ΄μ „λ²ˆν˜Έ(Prev)와 λ‹€μŒλ²ˆν˜Έ(Next)의 κ΄€κ³„λŠ” 'Next = ((Prev % 10) * 10) + (((Prev / 10) + (Prev % 10)) % 10)' κ°€ λœλ‹€. μ΄λ•Œ, λ‹€μŒλ²ˆν˜Έ(Next)의 값이 돌고 λŒλ‹€κ°€, 졜초둜 μž…λ ₯된 κ°’κ³Ό κ·Έ 값이 같아지면 사이클은 μ’…λ£Œλœλ‹€. μ•„λž˜ cycle ν•¨μˆ˜λŠ” ν•΄λ‹Ή λ‚΄μš©μ„ κ΅¬ν˜„ν•œ 것이닀.

3. μ½”λ“œ

#pragma warning(disable:4996) //visual studio scanf 였λ₯˜ 방지.
#include <stdio.h>

int cycle(int n) {
	int original = n;//졜초의 값을 μ €μž₯ν•˜λŠ” λ³€μˆ˜.
	int count = 0;//사이클 횟수λ₯Ό μ„ΈλŠ” λ³€μˆ˜.

	/* 식이 μ΅œμ†Œ 1λ²ˆμ€ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜κΈ°μ—, do while μ‚¬μš© */
	do {
		n = ((n % 10) * 10) + (((n / 10) + (n % 10)) % 10);
		count++;
	} while (original != n);		
	
	return count;
}


int main(int argc, char* argv[]) {
	int N;
	scanf("%d", &N);

	printf("%d", cycle(N));

	return 0;
}
728x90
λ°˜μ‘ν˜•