메이쁘

(JAVA) 백준 1356번 : 유진수 --- [문자열, 수학] 본문

Algorithm/Baekjoon

(JAVA) 백준 1356번 : 유진수 --- [문자열, 수학]

메이쁘 2020. 9. 6. 03:56

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

 

1356번: 유진수

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

www.acmicpc.net

 

안녕하세요.

 

 

이 문제는 문자열 + 수학 문제이다.

 

 

int 최대치까지 가능한 자연수를 입력으로 받고, 이 수를 두 부분으로 나눴을 때, 앞 부분의 모든 자리의 곱 과 뒤 부분의 모든 자리의 곱 이 같은지 비교하는 문제이다.

 

따지면 여러 방법이 있는데 필자의 방법을 포스팅해보겠다.

 

 

 

매커니즘


  1.  int 배열 A와 B를 입력받은 문자열 크기(len)만큼 선언한다. (문자열은 input 이라고 하자.)

 

 

  2.  for문으로 (1 ~ len-2) 까지 탐색하며, index는 i라고 할 때 A[i] = A[i - 1] * input[i] 이다. (input[i] 는 문자열의 i번째 수)

      -> 즉, 배열 A는 input의 0번째부터 i번째 까지의 수를 각각 곱한 값을 가리킨다.

 

 

  3.  2의 for문 내에서 함께 진행하는 코드로, B[j] = B[j + 1] * input[j] 이다. ( j = len - 1 - i 이다. 그 이유는, 역순으로 탐색해야 하기 때문에.)

      -> 즉, 배열 B는 input의 len - 1번째부터 j번째 까지의 수를 각각 곱한 값을 가리킨다. (A와는 반대로 시작)

 

  *** 시작 전에 초기값으로 A[0] = input[0] , B[len - 1] = input[len - 1] 을 해야 한다. 얘넨 숫자 하나만 있기도 하고,  혹시나 인덱스 오류가 발생할 수 있으니까 굳이 곱셈하지 않는다.

 

 

  4.  for문으로 (0 ~ n-1) 까지 탐색하며, index는 i라고 할 때 A[i] 와 B[i +1] 을 비교한다. 만약 같다면, 유진수 이므로 "YES", 다르면 "NO" 를 출력한다.

 

 

 

왜 이렇게 나오면 정답인지 정리하자면,

 

ex) 1236 일 때,

:             1    2    3    6

index :       0    1    2    3

A배열(→) :  1    2    6    X 

B배열(←) :  X  36   18   6    

  -> A[i] 와 B[i + 1] 을 전부 비교했을 때, A[3] = B[4] 이므로 유진수 

 

 

ex) 12345 일 때,

 :             1       2     3       4        5

index :       0      1      2       3       4

A배열(→) :  1      2      6      24     120 

B배열(←) :  X   240  120    20      5  

  -> A[i] 와 B[i + 1] 을 전부 비교했을 때, 같은 수가 없으므로 유진수 X

 

 

이상입니다.

 

감사합니다.

 

소스코드


 

Comments