소스코드
#include <stdio.h>
int main (){
int a, i;
scanf("%d", &a);
int number[10];
int len = 0;
int n = a;
while (n!=0){
number[len] = n % 10;
len++;
n = n/10;
}
int ans, ans1, ans2;
for (int temp = 1; temp<len; temp++){
ans = 0, ans1 = 1, ans2 = 1;
for (i=0; i<temp; i++){
ans1 = ans1*number[i];
}
for (i=temp; i<len; i++){
ans2 = ans2*number[i];
}
if (ans1 == ans2) {
printf("YES");
ans = 1;
break;
}
}
if (ans == 0) printf("NO");
return 0;
}
좀 복잡하게 풀어서... 부분부분 설명해본다.
헷갈렸던 부분은 사실 발상을 잘못한 부분이고 구현의 어려움은 없었음..!
이 문제는 index를 써야 하기 때문에 애초부터 배열에 각 자리 수를 넣었어야 하는데.. 생각을 못하고 그냥 나머지연산으로 해결하려고 했다. 이렇게 해결은 불가능한듯...
배열에 각 자리 수를 넣는 부분은 인터넷 검색을 참고했다. 스스로 다시 구현해보아야 할 듯...
해설
int a, i;
scanf("%d", &a);
우선 수를 int a로 선언하고 scan받았다. 자료형은 int이다.
이제 각 자리수의 숫자를 배열에 저장한다.
int number[10];
int len = 0;
int n = a;
while (n!=0){
number[len] = n % 10;
len++;
n = n/10;
}
배열을 number로 선언하고, 각 자리수를 저장한다.
근데 거꾸로 저장되는게 단점 ㅎ... 여기서는 곱셈할거라 어차피 상관없다.
int ans, ans1, ans2;
for (int temp = 1; temp<len; temp++){
ans = 0, ans1 = 1, ans2 = 1;
for (i=0; i<temp; i++){
ans1 = ans1*number[i];
}
for (i=temp; i<len; i++){
ans2 = ans2*number[i];
}
if (ans1 == ans2) {
printf("YES");
ans = 1;
break;
}
}
if (ans == 0) printf("NO");
return 0;
우선 temp를 지정했다. (앞으로 말하는 숫자들은 모두 index기준) temp는 1부터 len-1, 즉 마지막 index까지 한 칸씩 옮겨간다.
temp를 기준으로 0부터 temp-1까지와 temp부터 len-1까지의 값을 곱해 두 개를 비교,
같은 값이 하나라도 존재하면 "YES" 를 출력하고 break로 반복문 탈출
아니면 (끝까지 0이면) "NO" 출력.
'solving > C, C++' 카테고리의 다른 글
[백준] 1018 체스판 다시 칠하기 - C++ (Bruteforece, 완전탐색) (1) | 2022.09.21 |
---|---|
[백준] 1373번 2진수 8진수 (0) | 2022.09.07 |
[백준] 1296번 팀 이름 정하기 (변수 설정, strcmp) (0) | 2022.09.04 |
[백준] 1236번 성 지키기 (이차원 배열) (1) | 2022.09.02 |
[백준] 1032번 명령 프롬프트 (0) | 2022.09.01 |