본문 바로가기
Computer Science/PS

[PS] 12947. 하샤드 수

by BrickSky 2023. 11. 19.

1) 문제: 12947. 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한사항

• x는 1 이상, 10000 이하인 정수입니다.

입출력 예 설명

return
10true
12true
11false
13false

 

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를 반환하는 것.