티스토리 뷰
안녕하세요. iOS Developer, 멍구입니다. ㅎㅎ ☺️
오늘은 Swift 언어를 사용해서 간단한 기초 알고리즘 문제를 풀어볼까 합니다.
바로 프로그래머스의 1단계 문제 중 하나인 두 정수 사이의 합 문제입니다.
바로 문제 설명 들어가 보겠습니다.
두 정수 사이의 합 문제 설명
프로그래머스 기초문제 중 하나인 두 정수 사이의 합은 입력으로 주어지는 두 정수 사이의 합을 구하는 문제입니다.
가령, a = 3, b = 5라면 3 + 4 + 5 = 12의 값을 도출하면 됩니다.
여기에서 유의해야 할 점은 a, b는 -10,000,000 ~ 10,000,000 의 정수 인 점과, a가 b보다 클 수 있다는 점입니다. 이 부분을 주의해서 문제를 풀어주면 됩니다.
이 문제는 음수/양수 등의 조건에 따라 수학공식을 활용하면 O(1)로 풀 수 있는 문제입니다. 하지만, 이번 포스팅에서는 해당 a~b 범위의 정수를 하나하나 더해서 값을 도출하는 O(N)의 시간복잡도로 문제를 풀어보겠습니다.
만약 a == b 라면, a나 b의 값을 그냥 출력해주면 되구요. 앞서 말했던 a > b 인 경우의 입력값이 주어져있네요. a = 5, b = 3 인경우에도 3 ~ 5의 합을 구하면 됩니다. 그 값은 12 이겠죠.
이제 바로 코드로 구현해보겠습니다.
두 정수 사이의 합 스위프트 단순 코드 풀이
가장 직관적(?)으로 풀어본 코드 풀이입니다.
위의 코드는 a > b일 경우 b...a의 범위, b < a일 경우 a...b의 범위의 값을 순차적으로 순회해서 더한 값을 반환하는 코드입니다.
위와 같이 Swift언어에서는 Range 범위를 지정해서 for문에서 반복문 연산을 할 수 있습니다.
바로 위에서 구현한 코드 제출 결과 입니다.
이제 다른 방법으로도 풀어보겠습니다. Swift의 고차함수 중 하나인 reduce 메서드를 사용하는 방법입니다.
두 정수 사이의 합 스위프트 reduce 활용 풀이
reduce를 사용하면 위와 같이 단 한줄로 문제를 풀 수 있습니다. 위의 for문 연산과 방식은 별반 다르지 않습니다. 삼항연산자로 a > b유무를 판단하고, 그에 따라 특정 범위의 합을 구하는 코드입니다.
여기에서 reduce는 별로의 초기값을 받고(into), 해당 초기값에 배열을 하나하나 순회하면서 특정 연산을 초기값에 누적시켜서 반환하는 메서드입니다. 예를들면 전체 값의 합, 곱, 빼기 등이 가능한 것이지요. 물론 그 외의 더 복잡한 연산수행도 가능합니다. 한마디로, "reduce는 초기값에서 특정 연산을 누적한 결과를 반환한다." 라고 보시면 됩니다.
reduce는 위와 같이 배열 내의 전체 합을 구할때 단순히 reduce(0, +) 라는 명시만 하면 그 전체 합을 반환하게 됩니다.
(a...b)는 ClosedRange<Int>의 타입을 갖습니다. 해당 타입은 reduce 메서드를 사용해서 해당 범위 값에 대한 특정 연산값을 도출할 수 있습니다.
reduce 메서드에 대한 자세한 설명은 공식 swift 문서를 참고하시기 바랍니다.
이렇게 작성한 reduce를 사용한 문제풀이 결과는 아래와 같습니다.
음.... 단순 구현 코드보다 훨~~씬 느리네요.. ㅠㅠ 😢
제가 경험한 바로는 고차함수를 사용하는 것이 보통 더 느립니다. 하지만 생각 이상으로 느리군요.
고차함수 등의 내장함수를 사용하면 보통 미사용 코드보다 보통 느리다는 점 참고하시면 좋을 것 같습니다. 😃
오늘은 프로그래머스 기초, 두 정수 사이의 합 Swift reduce 문제풀이를 적어보았습니다.
흠... 저라면 reduce의 성능이 이정도라면 정말 필요하지 않다면, 사용하지 않고 풀 것 같아요. 물론 "두 정수 사이의 합" 문제는 수학공식을 활용해서 풀 것 같네요. ㅎㅎ
제가 놓치고 있는 부분이 있을 수 있어요. 많은 의견과 댓글 환영합니다. 즐 코딩 되세요~ 👨🏻💻
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
프로그래머스 알고리즘, 기능개발 swift 배열큐 문제풀이 (0) | 2020.09.12 |
---|---|
프로그래머스 swift 입문, 문자열 다루기 기본 문제풀이 (2) | 2020.09.11 |
카카오인턴 코딩테스트 기출, 키패드누르기 swift 문제풀이 (0) | 2020.09.07 |
스위프트 고차함수 활용, 백준 X보다 작은수 문제풀이 (0) | 2020.09.04 |
백준 아스키코드 11654, swift asciiValue 문제풀이 (0) | 2020.09.03 |
- Total
- Today
- Yesterday
- CoreML
- createML
- 자연어처리
- 백준알고리즘
- publisher
- Collection
- 프로그래머스
- swift언어
- ios
- 부스트코스
- swift문제
- swift reduce
- 컬렉션
- 알고리즘문제
- swift 기초
- swift string
- swift 문자열
- 프로그래머스swift
- 김프매매
- Protocol
- swift알고리즘
- 알고리즘
- swift
- Swift 알고리즘
- 스위프트
- uikit
- 프로토콜
- 백준swift
- 개발자문서
- SwiftUI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |