복대가리의 개발

[C#] 백준 (알고리즘)/브론즈 문제

[백준 - C#] 1356번 유진수

복대가리 2022. 9. 10. 09:00
728x90

문제링크

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

 

1356번: 유진수

첫째 줄에 수 N이 주어진다. 이 수는 2,147,483,647보다 작거나 같은 자연수이다.

www.acmicpc.net

 

문제

유진수는 어떤 수를 10진수로 표현한 뒤 그 수를 두 부분으로 나눴을 때, 앞부분 자리수의 곱과 뒷부분 자리수의 곱이 같을 때를 말한다.

예를 들어, 1221은 유진수이다. 12와 21로 나눴을 때, 앞부분 자리수의 곱 1*2는 뒷부분 자리수의 곱 2*1과 같기 때문이다. 1236도 마찬가지로 유진수이다. 하지만, 1234는 아니다. 수를 나눌 때 항상 연속된 자리수를 나눠야하고, 각 부분에 적어도 한자리는 있어야 한다.

예를 들어, 12345는 총 4가지 방법으로 나눌 수 있다. 1-2345, 12-345, 123-45, 1234-5 어떤 수 N이 주어질 때, 이 수가 유진수인지 아닌지 구하는 프로그램을 작성하시오.

조건

시간제한 : 2초
메모리 제한 : 128 MB

입력

첫째 줄에 수 N이 주어진다. 이 수는 2,147,483,647보다 작거나 같은 자연수이다.

출력

첫째 줄에 N이 유진수이면 YES, 아니면 NO를 출력한다.

 

문제정리

1. 유진수는 앞부분 자리수의 곱과 뒷부분 자리수의 곱이 같을 때입니다.
2. 수를 나눌 때 항상 연속된 자리수로 나눠야 합니다.
3. 각 부분에 적어도 한자리는 있어야 합니다.
4. 유진수가 아닌지 맞는지 구해야 합니다.

이번 문제의 경우 입력받은 값을 두 부분으로 나누어 앞의 총 곱과 뒷부분의 총 곱이 같은지 아닌지를 구하는 문제입니다.

앞부분과 뒷부분을 나누는 방식은 최소 한자리씩은 있어야 하며, 나누는 자리수는 정해지지 않았습니다.

즉, 나누는 모든 자리수를 파악하고 곱을 계산하여 유진수인지 아닌지 구하면 되는 문제입니다.

 

저의 경우 나눌 자릿 수인 middle 변수를 선언하고 반복문을 돌며 middle 값이 입력 받은 값의 길이와 같을 때까지 계산하며 middle 값을 1씩 증가시켜 주었습니다.

 

예를들어 입력받은 값이 47826라면

4 <-> 7826  / middle 값 : 1

47 <-> 826  / middle 값 : 2

478 <-> 26  / middle 값 : 3

4782 <-> 6  / middle 값 : 4

middle 값 5 == 총길이 5 => (반복문 종료)

 

위와 같이 총길이랑 middle값이 같아지면 종료하게 코딩하였습니다. 

그리고 만약 반복문을 돌다가 유진수의 값이라고 생각이 된다면 반복문을 즉시 종료하고 필요없는 계산은 하지 않도록 하였습니다. 자세한 내용은 아래의 C# 코드를 보면 아실 수 있으실 것 같습니다.!

 

C# 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        static void Main(string[] args)
        {
            //  https://bokhead.tistory.com/
            // 1356
            StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
            StreamReader reader = new StreamReader(Console.OpenStandardInput());
 
            char[] input = reader.ReadLine().ToCharArray();
            int[] value = new int[input.Length];
 
            // 입력받은 값을 한자리수로 모두 저장
            for (int i = 0; i < input.Length; i++)
                value[i] = int.Parse(input[i].ToString());
 
            int middle = 1// 수를 나눈 자릿 수
            bool result = false// 결과 저장 변수
 
            // 자릿수가 입력받은 수의 길이랑 같아지면 반복문 종료
            while (middle != input.Length)
            {
                int leftSum = 1;
                int rightSum = 1;
 
                // 앞에서부터 나눈 자리수까지 곱
                for (int i = 0; i < middle; i++)
                    leftSum *= value[i];
 
                // 나눈 자리수부터 입력받은 총 길이까지의 곱
                for (int i = middle; i < input.Length; i++)
                    rightSum *= value[i];
 
                // 곱한 두 값이 같으면 반복문 종료
                if (leftSum == rightSum)
                {
                    result = true;
                    break;
                }
 
                // 나눈 자리수 증가
                middle++;
            }
 
            WriteLine((result) ? "YES" : "NO");
            
            writer.Close();
            reader.Close();
 
        }
cs
읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90