
문제
준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.
영수증에 적힌,
구매한 각 물건의 가격과 개수
구매한 물건들의 총 금액
을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.입력
첫째 줄에는 영수증에 적힌 총 금액 가 주어진다.
둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 이 주어진다.
이후
개의 줄에는 각 물건의 가격
와 개수
가 공백을 사이에 두고 주어진다.출력
구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.
제한
풀이는 매우매우 간단하다!
총액을 입력 받고, 물건의 개수만큼 반복문을 돌며 각각의물건 값 * 개수의 합과 비교하면 된다!
import Foundation
let total = Int(readLine()!)!
let tc = Int(readLine()!)!
var a = 0
for i in 0..<tc {
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
a += input[0]*input[1]
}
if a == total {print("Yes")} else {print("No")}
답은 맞췄으나 조금 더 간결하게 작성할 방법을 생각해봤다.
😰 배열 이용하는 게 메모리 낭비일 수 있지 않을까?
😰if말고 삼항 연산자를 사용하면 더 간단하지 않을까?
let total = Int(readLine()!)!
var sum: Int = 0
for _ in 1...Int(readLine()!)! {
sum += readLine()!.split(separator: " ").map{Int($0)!}.reduce(1,*)
}
print( total == sum ? "Yes" : "No")
조금 더 짧고 간결한 코드를 작성했다. 🥰
그런데 여기서 reduce 사용에 대해 더 자세히 알아보고 싶어졌다!

고차 함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수’를 뜻한다.
map, filter, reduce 함수는 스위프트 표준 라이브러리의 컨테이너 타입(Array, Set, Dictionary 등)에 구현되어 있다.
reduce
initialResult
초기값으로 사용할 값을 넣으면 클로저가 처음 실행될 때, nextPartialResult 에 전달됨
nextPartialResult
컨테이너의 요소를 새로운 누적값으로 결합하는 클로저
최종 누적 값이 반환되며, 컨테이너의 요소가 없다면 initialResult 의 값이 반환
let someNumbers: [Int] = [2, 8, 15]
var result: Int = 0
// someNumbers의 모든 요소를 더합니다
for number in someNumbers {
result += number
}
print(result) // 25
reduce 사용컨테이너 내부의 값 합하기
// 초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다.
let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
print("\(first) + \(second)") // 0+2 2+8 10+15
return first + second
})
//더 간결히 작성하면
let sum: Int = someNumbers.reduce(0,+)
print(sum) // 25
컨테이너 내부의 값 빼기
// 초깃값이 0이고 someNumbers 내부의 모든 값을 뺍니다.
var subtract: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
return first - second
})
//간결히 작성
let sum: Int = someNumbers.reduce(0,-)
print(subtract) // -25
초기값을 설정하고 컨테이너 내부의 값 더하기
// 초깃값이 3이고 someNumbers 내부의 모든 값을 더합니다.
let sumFromThree = someNumbers.reduce(3) { $0 + $1 }
print(sumFromThree) // 28
내부의 값 곱하기
let someNumbers: [Int] = [2, 8, 15]
let sum: Int = someNumbers.reduce(1,*)
print(sum) //240
참고 자료를 확인하려면 요기 클릭!
🤨 그렇다면 위의 sum += readLine()!.split(separator: " ").map{Int($0)!}.reduce(1,*) 은 무슨 의미일까?
사이사이에 print로 결과를 출력하니 아래와 같았다!

즉, " 공백(" ")으로 문자열을 분리하고 각각을 Int형으로 변환한 후, 그 둘의 곱을 구하여
sum에 더해줘라!"라는 의미였다.
고차 함수에 대해 공부해두면 알고리즘 문제 풀이시 코드를 간결하게 작성될 때 도움이 되는 것 같다!