- Today
- Yesterday
- Total
메이쁘
(JAVA) 백준 1356번 : 유진수 --- [문자열, 수학] 본문
https://www.acmicpc.net/problem/1356
안녕하세요.
이 문제는 문자열 + 수학 문제이다.
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
이상입니다.
감사합니다.
소스코드
'Algorithm > Baekjoon' 카테고리의 다른 글
(JAVA) 백준 15649번 : N과 M(1). --- [백트래킹] (0) | 2020.09.07 |
---|---|
(JAVA) 백준 4354번 : 문자열 제곱 --- [KMP] (0) | 2020.09.06 |
(JAVA) 백준 1013번 : Contact --- [문자열 - 오토마타] (0) | 2020.09.05 |
(JAVA) 백준 11944번 : NN --- [문자열] (0) | 2020.09.04 |
(JAVA) 백준 1259번 : 팰린드롬수 --- [문자열] (0) | 2020.09.03 |