🔥개인 취미 목적으로 프로그래머스 문제를 정리한 게시글입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/12947
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✏️ 문제설명
양의 정수 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 |
💻 소스 코드
class Solution {
public boolean solution(int x) {
char[] chars = String.valueOf(x).toCharArray();
int sum = 0;
for(char c : chars) {
sum += (int) c - 48;
}
return x % sum == 0 ? true : false;
}
}
주어진 코드는 정수 x를 입력으로 받아서, 각 자릿수를 더한 값으로 x가 나누어 떨어지는지 여부를 판별하는 함수입니다. 코드의 동작을 다음과 같이 설명할 수 있습니다.
- 입력된 정수 x를 String.valueOf() 함수를 사용하여 문자열로 변환한 후 toCharArray() 함수를 사용하여 문자 배열로 변환합니다.
- 각 자릿수를 더할 값을 저장할 정수 변수 sum을 0으로 초기화합니다.
- for 루프를 사용하여 문자 배열 chars를 순회합니다. 각 반복에서 현재 문자 c를 정수로 변환하여 sum에 더합니다. 여기서 (int) c - 48은 문자 '0'에서 현재 문자 c의 ASCII 코드 값을 빼서 해당 문자가 나타내는 정수 값을 구합니다.
- 모든 자릿수를 더한 후, x % sum을 계산하여 x가 sum으로 나누어 떨어지는지 여부를 판별합니다.
이 코드는 입력된 정수 x의 각 자릿수를 더하고, 그 합으로 x를 나누어 떨어지는지를 판별하는 방식으로 동작합니다. 결과적으로 반환되는 값은 x가 sum으로 나누어 떨어지는 경우 true이고, 그렇지 않은 경우 false입니다.
번외)
int 값을 String으로 변환한 후 각 문자를 개별적으로 다루고자 할 때, split() 메소드를 사용하는 것과 toCharArray()를 사용하는 것 사이에는 몇 가지 차이점이 있습니다.
- split() 메소드 사용
- split("")을 사용하면 각 문자가 배열의 개별 요소로 분리됩니다.
- 코드가 약간 더 직관적일 수 있으며, String 관련 작업에 좀 더 편리할 수 있습니다.
- 하지만, 내부적으로 정규 표현식을 사용하기 때문에 toCharArray()보다 성능상 느릴 수 있습니다.
- toCharArray() 메소드 사용
- 이 함수는 String을 char 배열로 변환합니다.
- char 배열은 메모리를 적게 사용하고, 문자에 대한 접근이 빠릅니다.
- 성능상 이점이 있으며, 문자 데이터를 처리할 때 일반적으로 선호됩니다.
따라서, 단순히 각 문자를 분리하고자 하는 경우에는 toCharArray()를 사용하는 것이 일반적으로 더 효율적입니다. 그러나 특정 상황에서 String 배열이 필요하거나, 정규 표현식과 같은 추가적인 기능이 필요한 경우 split()을 사용할 수 있습니다. 성능과 코드의 명확성, 사용 목적에 따라 적절한 방법을 선택하는 것이 좋습니다.
시간 복잡도
- 숫자를 문자열로 변환 (String.valueOf(x)) : 이 연산의 시간 복잡도는 입력 숫자 x의 자릿수에 비례합니다. 숫자의 자릿수를 d라고 하면, 이 연산의 시간 복잡도는 O(d)입니다.
- 문자 배열로 변환 (toCharArray()) : 문자열을 문자 배열로 변환하는 데에도 문자열의 길이(d)에 비례하는 시간이 소요됩니다. 따라서, 이 연산의 시간 복잡도도 O(d)입니다.
- 각 자릿수의 합 계산 : for 루프는 배열의 각 원소(즉, 숫자의 각 자릿수)에 대해 한 번씩 실행됩니다. 각 반복은 상수 시간(O(1))이 걸리므로, 전체 루프의 시간 복잡도는 O(d)입니다.
- 나머지 연산 : x % sum 연산은 상수 시간에 수행됩니다(O(1)).
총 시간 복잡도는 각 단계의 복잡도를 합한 것이므로 O(d) + O(d) + O(d) + O(1) = O(d)입니다.
공간 복잡도
- 문자 배열 (char[] chars): 숫자 x의 각 자릿수를 저장하는 데 사용되므로, 공간 복잡도는 O(d)입니다.
- 기타 변수: sum과 같은 추가적인 정수 변수들은 상수 공간을 사용합니다(O(1)).
따라서, 전체 공간 복잡도는 O(d)입니다. 여기서 d는 입력 숫자 x의 자릿수를 나타냅니다.
'🕊️ 프로그래머스 > Lv1' 카테고리의 다른 글
[프로그래머스] Lv.1 두 정수 사이의 합 - Java (1) | 2023.11.29 |
---|---|
[프로그래머스] Lv.1 정수 내림차순으로 배치하기 - Java (3) | 2023.11.28 |
[프로그래머스] Lv.1 정수 제곱근 판별 - Java (0) | 2023.11.27 |
[프로그래머스] Lv.1 문자열 내 p와 y의 개수 - Java (0) | 2023.11.25 |
[프로그래머스] Lv.1 자릿수 더하기 - Java (0) | 2023.11.24 |