- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 정렬 알고리즘
- swift
- dart
- 코딩테스트
- datastructure
- sort
- programmer
- swift split
- 스위프트
- 정렬
- programmers
- 코테
- Algorithm
- rxswift
- coding test
- 정렬알고리즘
- 프로그래머스 swift
- 프로그래머스
- Design Pattern
- 다트
- swift 코딩테스트
- 프로그래머스 레벨2
- 자료구조
- 감성에세이
- 디자인 패턴
- 스위프트디자인패턴
- 프로그래머스 level1
- 알고리즘
- swift 알고리즘
- 디자인패턴
Bill Kim's Life...
[Swift] 프로그래머스 연습 문제(Level 1) : 약수의 합 본문
실제 코딩테스트의 문제를 통하여 알고리즘 분석과 코딩 능력을 향상시킵니다.
#. 구독 대상
- 기본 알고리즘을 코딩 테스트 문제를 통하여 학습하고 싶으신 분
- 취업 및 이직을 준비하고 계신 개발자
- Swift를 통하여 코딩 테스트 문제를 살펴보고 이해를 하고 싶으신 분
- 코딩 테스트에 대한 거부감을 없애기 위하여 기초부터 하나씩 공부해보고 싶으신 분
- 기타 알고리즘과 문제 해결 능력에 대해서 관심이 있는 모든 개발자분
참고 사항
본 코딩 테스트 문제에 대한 설명 및 해결 방안은 최적의 답이 아닐 수 있습니다.
본 강의에서 지향하는 목표는 바로 특정 문제에 대한 최적의 해결 방법을 찾기보다는 특정한 문제에 대해서 충분히 이해할 수 있고 다양한 방법을 통하여 해결하는 방법을 찾고 향상시키는데 그 목적이 있습니다.
좀 더 좋은 알고리즘 및 코드가 있으시다면 언제든지 본 게시물의 댓글을 통해서 제시해주시면 감사하겠습니다.
코딩 테스트 문제
먼저 오늘 살펴볼 문제에 대해서 먼저 살펴보겠습니다.
programmers.co.kr/learn/courses/30/lessons/12928
문제 설명
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제한 조건
- n은 0 이상 3000이하인 정수입니다.
입출력 예
n | return |
12 | 28 |
5 | 6 |
입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
문제 분석
오늘 문제는 정수 n을 입력받아 n의 약수를 모두 구하고 모든 약수를 더한 값을 리턴하는 함수를 만드는 문제입니다.
수학에서 약수란 아래와 같이 정의되는 수를 뜻합니다.
약수(約數, 영어: divisor) 또는 인수(因數, 영어: factor, 전 용어: 승자(乘子))는 어떤 수로 정수가 나누어떨어지는것을 대하여 이르는 말이다
알고리즘
위의 내용을 기반으로 하여 본 문제를 해결하기 위한 알고리즘을 살펴보면 아래와 같습니다.
- 약수를 구했을 경우 합산을 할 변수를 하나 선언합니다.
- 입력 숫자가 0인 경우를 배제하고 1부터 하나씩 증가시키면서 현재 숫자와 n의 값을 나누어 0으로 떨어지는 수를 찾습니다.
- 0으로 나누었을 경우는 약수이므로 합산 변수에 해당 수를 합산합니다.
- 최종 합산 변수를 리턴합니다.
코드 설명
그렇다면 위의 알고리즘에 대해서 하나씩 살펴보면서 코드로 작성을 해보도록 하겠습니다.
- 약수를 구했을 경우 합산을 할 변수를 하나 선언합니다.
var count = 0
- 입력 숫자가 0인 경우를 배제하고 1부터 하나씩 증가시키면서 현재 숫자와 n의 값을 나누어 0으로 떨어지는 수를 찾습니다.
- 0으로 나누었을 경우는 약수이므로 합산 변수에 해당 수를 합산합니다.
for i in 1...n {
if n%i == 0 {
count += i
}
}
- 최종 합산 변수를 리턴합니다.
return count
위의 코드들을 모두 조합하여 최종 코드를 완성하면 아래와 같습니다.
최종 코드
func solution(_ n:Int) -> Int {
var count = 0
for i in 1...n {
if n%i == 0 {
count += i
}
}
return count
}
같은 풀이 방식을 Swift의 고차 함수를 사용하여 풀면 아래와 같이 작성될 수 있습니다.
좀 더 효율적인 코드 방식에 대해서 고민하신다면 아래의 코드도 보시고 이해해보시길 바랍니다.
func solution(_ n:Int) -> Int {
// 0이 입력되면 그냥 0 리턴
if n == 0 {
return 0
}
// 1부터 입력 숫자까지 돌면서 비교
// filter 함수로 현재 값이 n과 나누어 0인 값만 추출
// 0으로 나누어 떨어진 값들을 + 연산자를 통하여 합산
return Array(1...n).filter{n % $0 == 0}.reduce(0, +)
}
이상으로 오늘 제시한 문제에 대해서 분석 및 코드를 작성해 보았습니다.
감사합니다.
[참고 자료(References)]
[1] 프로그래머스 - 약수의 합 : programmers.co.kr/learn/courses/30/lessons/12928?language=swift#_=_
[2] 약수(위키피디아) : ko.wikipedia.org/wiki/약수
'CS(컴퓨터 과학) > Coding Test' 카테고리의 다른 글
[Swift] 프로그래머스 연습 문제(Level 1) : 자릿수 더하기 (0) | 2021.04.23 |
---|---|
[Swift] 프로그래머스 연습 문제(Level 1) : 이상한 문자 만들기 (0) | 2021.03.31 |
[Swift] 프로그래머스 연습 문제(Level 1) : 내적 (0) | 2021.03.08 |
[Swift] 프로그래머스 연습 문제(Level 1) : 문자열을 정수로 바꾸기 (0) | 2021.03.08 |
[Swift] 프로그래머스 연습 문제(Level 1) : 수박수박수박수박수박수? (0) | 2021.02.28 |