(leetcode-weekly contest 391) 3099. Harshad Number 하샤드 수

박세진·2024년 4월 1일

코딩테스트

목록 보기
6/7
post-thumbnail

2024.04.01

Leetcode-weekly contest 391) 3099. Harshad Number

An integer divisible by the sum of its digits is said to be a Harshad number. You are given an integer x. Return the sum of the digits of x if x is a Harshad number, otherwise, return -1.


Example 1:

Input: x = 18

Output: 9

Explanation:

The sum of digits of x is 9. 18 is divisible by 9. So 18 is a Harshad number and the answer is 9.

Example 2:

Input: x = 23

Output: -1

Explanation:

The sum of digits of x is 5. 23 is not divisible by 5. So 23 is not a Harshad number and the answer is -1.

 

Constraints:

1 <= x <= 100


0. 개념이해

하샤드 수는 자신의 숫자를 구성하는 각 자릿수의 합으로 자신이 나누어지는 수를 의미합니다.

  • 예시 1: 21
    자릿수 합 계산: 2+1=3
    나눗셈 검사: 21÷3=7
    결과: 21은 3으로 나누어떨어지므로, 21은 하샤드 수입니다.

  • 예시 2: 18
    자릿수 합 계산: 1+8=9
    나눗셈 검사: 18÷9=2
    결과: 18은 9로 나누어떨어지므로, 18은 하샤드 수입니다.

  • 예시 3: 23
    자릿수 합 계산: 2+3=5
    나눗셈 검사:23÷5는 나누어떨어지지 않습니다 (정확히 나누어떨어지는 몫이 없음).
    결과: 23은 자신의 자릿수 합인 5로 나누어떨어지지 않으므로, 23은 하샤드 수가 아닙니다.
    이 예시들을 통해 볼 때, 하샤드 수는 그 자릿수들의 합으로 정확히 나누어떨어지는 특성을 가진 수입니다. 자릿수의 합으로 나누어떨어지지 않는 수는 하샤드 수가 아닙니다.


1. 문제풀이

1-1. 문제 이해

하샤드 수(Harshad number)는 자신의 숫자를 구성하는 각 자리 숫자의 합으로 나누어질 수 있는 정수를 의미합니다.

  1. 이 문제에서는 주어진 정수 x가 하샤드 수인지 판별하고,
  2. 만약 하샤드 수라면 그 숫자의 자릿수 합을 반환하며, / 2-2. 아니라면 -1을 반환하라는 요구사항입니다.

1-2. 문제풀이단계

  1. 문제이해 및 분석
  • 하샤드 수의 정의 이해 ("주어진 정수 / 각 자릿수 숫자들의 합" 이 나누어떨어짐)
  • 입력과 출력을 확인
  1. 자릿수의 합 계산
  • x의 자릿수를 알아낸다
  • 합산하는 방법 결정
  1. 하샤드의 수 판별
  • "주어진 정수 / 각 자릿수 숫자들의 합"
    나머지 0 이면 하샤드 수 아니면 하샤드 수 아님
  1. 결과 반환
  • 하샤드 수일 경우 : 자릿수의 합 반환
  • 아닌 경우 : -1 반환
  1. 예외 처리
  • 제약조건(1<= x <= 100) 고려하여 입력값 범위에 대한 처리 방법 고려
  1. 테스트 케이스 실행
  • x 값 사용하여 코드 테스트

1-3. 로직 구성

  1. 각 자리를 한개의 단위로 나눌 수 있는 기능
  2. 각 숫자를 합한다
  3. 주어진 숫자를 합한 숫자로 나눌 수 있는 단계
  4. "주어진 수/자릿수 합"으로 계산하여 예 / 아니오로 값 return
  • 조건에 맞을 경우 "주어진 수 / 자릿수 합" 결과를 return
  • 조건에 맞지 않을 경우 -1 을 return

1-4. (풀이 예시 상세) 자릿수를 찾아내고 합을 구하는 과정

맞습니다, 나누기 연산(/)은 몫을 구하는 연산이고, 모듈로 연산(%)은 나머지를 구하는 연산입니다. 제가 제공한 예시에서는 이 두 연산을 사용하여 정수의 각 자릿수를 추출하고 합산하는 과정을 설명하고 있습니다. 이 과정을 자세히 살펴보겠습니다:

  1. 모듈로 연산 (% 10): 이 연산은 정수를 10으로 나눈 나머지를 반환합니다. 10으로 나눈 나머지는 항상 정수의 마지막 자릿수와 동일합니다. 예를 들어, 123 % 10은 3을 반환하며, 이는 123의 마지막 자릿수입니다.

  2. 나누기 연산 (/ 10): 이 연산은 정수를 10으로 나눈 몫을 반환합니다. 이를 통해 정수의 마지막 자릿수를 제거할 수 있습니다. 예를 들어, 123 / 10은 12를 반환하며, 이는 123의 마지막 자릿수를 제거한 결과입니다.

이 두 연산을 반복적으로 사용하여 정수의 각 자릿수를 차례대로 추출하고 합산할 수 있습니다. 예를 들어, 정수 123의 자릿수 합을 구하는 과정은 다음과 같습니다:

  • 첫 번째 단계에서 123 % 10을 계산하여 마지막 자릿수인 3을 얻습니다. 이를 합계에 더합니다.
  • 다음으로 123 / 10을 계산하여 12를 얻고, 이 과정을 12에 대해서 반복합니다.
  • 12 % 10을 계산하여 마지막 자릿수인 2를 얻고, 합계에 더합니다.
  • 12 / 10을 계산하여 1을 얻고, 이 과정을 1에 대해서 반복합니다.
  • 1 % 10은 1이고, 1 / 10은 0입니다. 따라서 더 이상 반복할 수 없으므로 과정을 종료합니다.

합계는 이제 각 자릿수의 합인 6이 됩니다. 이 방식으로 정수의 자릿수 합을 계산할 수 있습니다.

1-5. (풀이 예시 상세) 참고풀이

자릿수의 개수를 알아내는 방법 중 하나는 주어진 정수를 10으로 반복해서 나누면서 몫이 0이 될 때까지의 반복 횟수를 세는 것입니다. 이 방법은 정수를 10으로 나눌 때마다 한 자릿수씩 줄어들기 때문에 효과적입니다. 아래는 자릿수의 개수를 알아내는 과정을 설명합니다:

  1. 주어진 정수 x가 0이 아닌 경우에만 자릿수를 세기 시작합니다. x가 0인 경우, 자릿수는 1입니다(0 자체가 하나의 자릿수임).
  2. x를 10으로 나눈 몫을 계산하고, 이를 새로운 x값으로 할당합니다 (x = x / 10).
  3. 이 과정을 x가 0이 될 때까지 반복합니다.
  4. 각 반복마다 카운터를 1씩 증가시켜 자릿수의 총 개수를 세어나갑니다.

예를 들어, 정수 12345의 자릿수 개수를 세는 과정은 다음과 같습니다:

  • 초기값: x = 12345, 자릿수 카운터 = 0
  • 1회 반복: x = 1234, 자릿수 카운터 = 1
  • 2회 반복: x = 123, 자릿수 카운터 = 2
  • 3회 반복: x = 12, 자릿수 카운터 = 3
  • 4회 반복: x = 1, 자릿수 카운터 = 4
  • 5회 반복: x = 0, 자릿수 카운터 = 5, 반복 종료

따라서 정수 12345의 자릿수 개수는 5개입니다.

이 과정을 코드로 구현하면 다음과 같습니다:

int countDigits(int x) {
    if (x == 0) return 1; // 0의 자릿수는 1개입니다.

    int count = 0;
    while (x != 0) {
        count++;       // 자릿수 카운터를 증가시킵니다.
        x = x / 10;    // x를 10으로 나눈 몫을 x에 할당합니다.
    }
    return count;
}

이 함수는 주어진 정수 x의 자릿수 개수를 반환합니다.


2. 코드 작성

class Solution {
    public int sumOfTheDigitsOfHarshadNumber(int x) {
        if (x == 0)
            return 1;

        int sum = 0;
        int original = x;
        int digitCount = 0;

        while (x > 0) {
            sum += x % 10;  // 로직구성1,2. 각 자릿수의 합
            x = x / 10;     // 다음 단계로 넘어가기
            digitCount++;   // 총 자리수
        }

        if (original % sum == 0) {	// 로직구성3,4
            return sum;
        } else {
            return -1;
        }
        
    }

}

3. 결과


3-1. 성능

3-2. 결과화면

profile
Server Backend Engineer

0개의 댓글