코딩테스트 준비 - 더하기사이클

혼자서 다시푸는 코딩테스트 준비 일지 - 76
수학구현
avatar
2024.12.09
·
7 min read

다시푸는 코딩 테스트 준비 일지

문제

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

문제 풀이 접근

일단 문제에 대해서 조금 이해가 안되는 부분이 있다.
문제에서 "(0 <= a <= 99) 로 주어진다. 값이 10보다 작다면 0을 붙여 두자리수로 만들고. 각 자리수를 더한다. 그 다음 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면"
이라고 나와있다.

그렇다면 만약에 5가 주어진다면
1. 0을 붙인다 => 주어진 수는 50 변경
2. 각 자리 수를 더한다 => 5+0 => 5
3. 그 다음 주어진 수의 가장 오른쪽 자리 수와 합의 가장 오른쪽 자리 수를 이어붙이면 => 0+5 => 5
이렇게 되는데, 문제가 풀리는 과정을 따라가보면서 내가 풀어보면

1. 0을 붙인다 = > 주어진 수는 50 변경
2. 각 자릿 수를 더한다 => 5+0 => 5
3. 그다음 주어진 수의 오른쪽 자리 수와, 합의 오른쪽 자리 수를 이어 붙이면인데, 여기선 0을 수로 보지않고 50의 십의자리수 5와 2번에서 구한 5를 이어붙인다. => 55 가 되는데 문제는 이렇게해야 풀린다.

설명을 뭔가 이해하기 조금 힘들었었다.

이 문제를 풀기위한 로직은 아래와 같다.

  1. 주어진 수가 작은 수일 경우 뒤에 0을 붙여 2자리 수를 만든다.

  2. 주어진 수를 일의 자리, 십의 자리 분리한다.

  3. 일,십의 자리의 합에서 오른쪽 자리수가 필요하다. 1자리면 그대로 사용, 2자리면 제일 오른쪽 자릿수를 사용한다.

  4. 수를 이어붙여 새로운 수를 만드는데, 이 수가 처음 주어진 수와 동일하다면 사이클 횟수를 출력한다.

작성 코드 (C#)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Linq;
using static CodingTestProj.Program;
using System.Text;

///*
// * Difficulty : Easy
// * URL : https://www.acmicpc.net/problem/1110
//  * Time : 35m
// */

namespace CodingTestProj
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Solution solu = new Solution();
            solu.solve();
        }
    }

    public class Solution
    {
        // 0 ~ 99 
        public int _val;
        public int _ret;

        // 10보다 작다 => 0을 붙인다.

        public void solve()
        {
            _val = int.Parse(Console.ReadLine());
            _ret = 0;

            int _calc = _val;

            while(true)
            {
                ++_ret;

                int _valRet = 0;
                int _tempCalc = 0;
                bool _isLower10 = (_calc < 10) ? true : false;

                if (_isLower10)
                {
                    _tempCalc = _calc * 10;
                    _calc = _tempCalc;
                }

                int _val1 = _calc / 10; // 십의자리
                int _val2 = _calc % 10; // 일의자리

                int _val3 = (_val1 + _val2) >= 10 ? (_val1 + _val2) % 10 : _val1 + _val2;

                if (_isLower10)
                    _valRet = (_val1 * 10) + _val3;
                else
                    _valRet = (_val2 * 10) + _val3;

                if (_val == _valRet)
                    break;

                _calc = _valRet;
            }

            Console.WriteLine(_ret);
        }
    }
}

코드 결과

2659







- 컬렉션 아티클