본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 하샤드 수(C#)

by jyppro 2023. 7. 24.

하샤드 수

이번에는 "하샤드 수" 문제를 풀어보도록 하겠습니다. 문제의 제목만 보면 어떤 문제인지 감이 안잡힙니다. 문제사항을 한번 살펴보도록 하겠습니다.

 

문제 설명

양의 정수 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

 

입출력 예 설명

입출력 예 #1

10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

 

입출력 예 #2

12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3

11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

 

입출력 예 #4

13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

 

개념풀이

하샤드 수(harshad number)는 주어진 진법에서 그 수의 각 자릿수 숫자의 합으로 나누어떨어지는 자연수를 말합니다.

인도의 수학자 카프리카가 정의했으며, '기쁨을 준다'는 뜻의 산스크리트어 단어인 harshad에서 유래했다고 합니다.

하샤드 수를 찾는 방법에 대해서 간략하게 설명하면 주어진 수의 각 자리수를 전부 더한 것으로 주어진 수를 나누었을 때 나누어 떨어지면 하샤드 수인 것입니다. 입출력 예를 통해서 더 자세히 확인할 수 있습니다.

 

시작 코드

public class Solution {
    public bool solution(int x) {
        bool answer = true;
        return answer;
    }
}

 

나의 풀이

using System;

public class Solution
    {
        public bool solution(int x)
        {
            string temp = x.ToString();
            int sum = 0;
            for (int i = 0; i < temp.Length; i++)
            {
                sum += (int)Char.GetNumericValue(temp[i]);
            }
            bool answer = x % sum == 0 ? true : false;
            return answer;
        }
    }

그럼 문제 풀이를 살펴보도록 하겠습니다. 처음에 int형의 x가 주어집니다. 먼저 string타입의 temp를 선언하고, 그 안에 x를 ToString()을 통해 string타입으로 변환시켜 저장합니다. 앞으로는 이전에 이미 한번 등장했던 메서드나 함수같은 경우는 다시 설명하지 않고 넘어가겠습니다.int형 sum을 초기화 시켜주고 for문을 작성합니다. temp의 길이까지 실행시키며, for문을 돌리는 동안 temp의 각 인덱스의 값을 int형으로 변환하는 작업을 거쳐 sum에 더해줍니다. 참 거짓을 반환하는 bool타입의 answer를 선언하고 이어서 삼항연산자를 이용한 식을 만들어 줍니다. 식의 내용은 x를 sum으로 나눈 나머지가 0이라면 true를 반환하고 아니라면 false를 반환하는 것입니다.

 

이번 문제에서 사용된 풀이방법은 이전에 했던 것처럼 형식을 변환시켜 주었습니다. 이번에 자세히 살펴봐야 할 것은 temp를 통해 정수 x를 string타입으로 만들어 주고 temp를 for문을 돌려 각 인덱스의 접근했는데, 이 때의 temp[i]는 주어진 숫자의 각 자리수에 접근하는 방법을 나타낸 것입니다. 그리고 Char.GetNumericValue()는 숫자 유니코드 문자를 해당 숫자로 변환하는 방법입니다. 한마디로 문자열을 다시 숫자로 돌려주는 내장 메소드 중 하나입니다. 그리고 앞에 (int)를 붙여주어서 int형으로 만들어 sum에 더해줍니다. 그리고 문제의 최종목적은 하샤드 수인지 아닌지 판별하는 것이므로 bool타입으로 반환해줘야 합니다. 삼항연산자의 식을 보면 주어진 수 x를 각 자리수의 합을 나타내는 sum으로 나누었을 때 나머지가 0 즉, 나머지가 없으니 나누어 떨어지면 true를 담아 반환해줍니다. 아니라면 false를 반환합니다.

 

<NEXT>

이번에는 "하샤드 수" 문제를 풀어보았습니다. 단어는 생소한 것이었으나 막상 개념은 전혀 모르는 사람도 쉽게 이해할 수 있는 개념이어서 푸는 데 문제는 없었던 것 같습니다. 형변환은 앞으로도 계속 자주 사용될 것이기 때문에 각 메서드 등 내부함수를 잘 기억하는 것이 좋을 것 같습니다. 다음에는 "두 정수 사이의 합" 문제를 풀어보도록 하겠습니다. 감사합니다.