1) 문제: 12947. 하샤드 수
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
제한사항
• x는 1 이상, 10000 이하인 정수입니다.
입출력 예 설명
x | return |
10 | true |
12 | true |
11 | false |
13 | false |
2) 나의 첫 풀이
이전에 계속 사용했던 풀이인 10으로 나누고 나머지를 전부 더한 다음, 합한 나머지로 X가 나뉘면 true를 출력하고 아니면 false를 출력하면 될 것 같다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool solution(int x) {
bool answer = true;
int sum = 0;
while(x>=1 && x<=10000){
sum += x%10;
x /= 10;
}
if(x % sum == 0){
answer = true;
}
else {
answer = false;
}
return answer;
}
3) 수정한 풀이
블로그를 참고했다.
고친 부분이 2개가 있는데, 이는 아래의 배운 점에 적을 생각이다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool solution(int x) {
bool answer = true;
int copy = 0;
int sum = 0;
copy = x;
while(copy>=1 && copy<=10000){
sum += copy%10;
copy /= 10;
}
answer = (x % sum == 0) ? true : false;
return answer;
}
4) 배운 점
1. 저장할 변수 생성
- 수정되는 경우를 대비해서 복사할 값을 저장할 변수를 만들어야 한다.
- copy = x; 코드를 활용해서 문제를 정확히 풀 수 있었다. copy에 x의 값을 저장해 둠으로써 while문의 반복에 의해 x의 값이 수정되어 결괏값에 영향을 주지 않도록 하는 것이다. while 루프를 돌며 x는 계속해서 연산에 의해 값이 줄어든다. 그렇게 되면 answer = (x % sum == 0)? true : false; 해당 코드에서 원하는 x값이 아닌 줄어든 x값으로 연산을 해야하는 문제점이 생긴다. 따라서 초기의 값을 copy변수에 저장해 둠으로써 원래 값에 영향을 미치지 않고 각 자릿수에 대한 작업을 수행할 수 있게 되는 것이다. 지금까지 알고리즘 문제를 풀며 이런 코드를 작성해 본 경험이 없어 당황하긴 했지만 자주 사용될 것 같아 꼭 기억해두려 한다.
2. 삼항 연산자 활용
- 삼항 연산자
- iOS 공부를 할 때 정말 많이 사용했던 개념인데 실제로 적용을 못하는 걸 보면 나의 지식이 아닌것 같다. 우선 삼항 연산자는 두 개의 값 중 하나를 선택해서 반환하는 연산자이다. answer = (x % sum == 0)? true : false; 해당 코드에서는 true를 반환하거나 false를 반환할 것이다. ( x % sum == 0) 조건이 참이라면? true를 아니면 false를 반환하는 것.
'Computer Science > PS' 카테고리의 다른 글
[PS] 12943. 콜라츠 추측 (0) | 2023.11.21 |
---|---|
[PS] 12912. 두 정수 사이의 합 (2) | 2023.11.19 |
[PS] 12934. 정수 제곱근 판별 (0) | 2023.11.19 |
[PS] 12932. 자연수 뒤집어 배열로 만들기 (2) | 2023.11.18 |
[PS] 12925. 문자열을 정수로 바꾸기 (2) | 2023.11.18 |