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가 하샤드 수인지 아닌지를 판별해야하는 알고리즘입니다.
하샤드 수란?
"주어진 숫자의 각 자릿수의 합으로 해당 숫자가 나누어져야 하는 조건을 만족하는 수"를 이야기하죠
예) 18의 경우 자릿수의 합이 1+8=9이고, 18을 9로 나누면 나머지가 0이므로 18은 하샤드 수인 것이죠.
* 로직구상 *
우선 입력된 숫자의 각 자릿수를 구하고, 그 합을 구할 수 있어야 하겠죠.
왜 입력된 숫자의 각 자릿수를 구해야 하는건가요?
주어진 숫자가 하샤드 수인지 판별하기 위해서에요
하샤드 수를 판별하기 위해서는
주어진 숫자의 각 자릿수를 더한 값이
숫자 자체로 나누어 떨어져야 합니다.
각 자릿수를 구해서 더한 후에
숫자 자체로 나누어 떨어지는지를
확인하기 위해서는 숫자의 각 자릿수를
따로 저장하는 것이 필요해요.
예를 들어, 숫자 "18"이 주어졌을 때, 이 숫자의 각 자릿수를 구하면 "1"과 "8"이 됩니다.
이 두 자릿수를 더한 값은 "9"가 됩니다.
그리고
"18"을 "9"로 나누면 나머지가 "0"이므로 "18"은 하샤드 수입니다.
따라서
입력된 숫자의 각 자릿수의 합을 구하는 것은
하샤드 수 판별에 필수적인 과정이에요.
그리고
그 합으로 입력된 숫자를 나누어 나머지를 확인하여
하샤드 수인지 아닌지를 판별해야 하죠
자 이제 로직을 구상을 해보았다면 실질적으로 코드를 작성해보아야겠죠?
먼저 함수를 정의하는 부분부터 해봅시다.
func solution(_ x: Int) -> Bool {
가장 먼저 문제에서 "자연수 x를 입력받아 x가 하샤드 수인지
아닌지 검사하는 함수, solution을 완성하라" 라고 명시 되어있잖아요?
이를 토대로 키워드 "func"를 사용해서 "solution" 이라는 함수를 정의해 주고
입력값으로 정수 x를 받게 하고
우리가 문제에서 "하샤드 수인지 아닌지 검사하라" 라고 명시되어 있잖아요?
때문에 참과 거짓을 판단하는 불리언이라는 데이터값을 명시해주어야겠죠.
즉,
불리언 할 값을 반환 해야겠죠 x는 우리가 판별할 숫자를 이야기 합니다.
함수를 정의 해 주었으니 가장먼저 주어진 숫자가 하샤드 수인지를 판별하기 위해
각 자릿수를 더한 후에 이를 활용 해야 하니까
숫자의 각 자릿수를 구하는 구문을 먼저 작성할 필요가 있죠
let digits = String(x).compactMap { Int(String($0)) }
"digits" 라는 이름으로 상수를 선언해주고
x를 문자열로 변환시켜주도록 합시다.
여기서
먼저 입력된 숫자 x를 문자열로 변환한 후에,
숫자의 각 자릿수를 배열에 저장 하기 위해서 "compactMap" 함수를 사용하여
문자열을 순회하면서 각 문자를 정수로 변환한 배열 "digits"를 만들어줍시다.
다음으로는 그렇게 "배열에 저장 한 각 자릿수의 합"을 구하는 구문이 필요하겠죠?
let digitSum = digits.reduce(0, +)
"digitSum" 라는 이름의 상수를 선언해주고
그 안에 각 문자를 정수로 변환한 " digits" 상수 배열을 넣어주는데,
여기서는 "reduce" 메서드를 사용하여 배열의 합을 구해줘야하죠.
"reduce" 메서드는 배열의 각 요소에 대해
일련의 작업을 수행한 후 하나의 값으로
결과를 결합하는 역할을 해주죠
여기서는 각 요소를 더하여 전체 합을 구합니다.
마지막으로 그렇게 합을 구했다면 하샤드 수인지 아닌지를 판별하는 구문이 필요하겠죠?
return x % digitSum == 0
반환하라는 return을 작성해주고 여기서는 입력된 숫자 x를
자릿수의 합인 digitSum으로 나눈 나머지가 0인지를 확인하여
하샤드 수인지 아닌지를 판별해주도록 합시다.
나머지가 0이면 해당 숫자는 하샤드 수이므로 true를 반환하고,
그렇지 않으면 false를 반환하겠죠!
'IOS > Swift-Algorithm (Programmers)' 카테고리의 다른 글
[Swift] Programmers - 콜라츠 추측 (0) | 2024.02.28 |
---|---|
[Swift]Programmers - 두 정수 사이의 합 (2) | 2024.02.27 |
[Swift]Programmers - 정수 내림차순으로 배치하기 (0) | 2024.02.22 |
[Swift] Programmers - 정수 제곱근 판별 (0) | 2024.02.21 |
[Swift]Programmers - 문자열을 정수로 바꾸기 (0) | 2024.02.20 |