티스토리 뷰

반응형

 

 

안녕하세요? iOS Developer, 멍구입니다! 😊

오늘은 또 간단한 백준문제를 swift로 풀어보겠습니다. 
대신, 그냥 풀면 재미없을 것 같아서 스위프트 고차함수를 사용해서 풀어보겠습니다!

swift의 고차함수는 "다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수"를 의미합니다.

 

 


X보다 작은 수 10871 

 

 

이번 포스팅에서는 X보다 작은 수를 풀어볼건데요.
solved.ac기준 브론즈3의 기초문제입니다. 

 

 

 

 

문제의 요지는 이렇습니다!

정수 N개로 이루어진 수열 A에서 X미만의 수만 뽑아서 출력하면 되는 문제입니다. 
이어서 입/출력 방식을 보겠습니다. 

 


X보다 작은 수 입출력 방식

 

 

예를 들어봅니다. 먼저, N과 X가 주어집니다. N은 이후 주어질 수열의 숫자 갯수, X는 수열의 값을 추려낼때의 기준이 됩니다. X미만의 값만 남겨서 출력해주면 됩니다. 

위의 예시를 보면, 10, 5는 수열의 크기는 10이고, X는 5임을 의미합니다. 
그 뒤에 1, 10, 4, 9, 2, 3, 8, 5, 7, 6을 입력받는데 이것이 수열 A입니다.

답은 해당 수열 A에서 X 미만의 값만 뽑아내면 됩니다. 그 답은 5 미만의 값으로 이루어진 "1 4 2 3"이 됩니다. 

이제부터 해당 문제를 swift의 고차함수를 활용해서 풀어보겠습니다!

 

 


X보다 작은 수 Swift 문제풀이

 

 

1) 먼저 스위프트 언어로 입력을 받는 부분입니다. 일반적으로 스위프트에서는 입력을 line 단위로 받는데 그때 사용하는 것이 readLine()입니다. 
readLine()은 String? 타입을 리턴합니다.

2) 백준에선 입력값을 보장하는 경우에 "!"를 통해 강제언래핑을 해버립니다.
그렇게 String? -> String 타입이 되고, split(separator: " ")를 통해 공백 단위로 입력받은 값을 [Character] 타입으로 변환합니다.

3)  [Character] 타입을 [Int] 타입으로 변환합니다. Int(String($0))!에서 $0는 [Character] 타입 내의 원소 하나하나로 보시면 됩니다. 

Int(String($0))! 대신 Int($0)! 로 변환할 수도 있습니다. 하지만 해당 방법은 좀더 느리다고 하는데요. 이에 대해서는 관심있으시면 찾아보시길 바랍니다. 

 

-> 그렇게 첫번째 라인은 [10, 5]의 [Int]타입 배열을 받게 되었습니다.

4) X에는 arr[1]로 [10, 5]배열 내의 5 값이 들어가게 됩니다. 

이제 두번째 라인을 받는 부분입니다. 
저는 여기에서 받은 값을 별도로 변수저장하지 않고 바로 고차함수를 사용해서 답을 도출할 겁니다. 

 

 

 

 

5) readLine()! : 먼저 2번째 라인을 받습니다. String 타입을 받게 됩니다. 

6) .split(separator: " ") : 앞서 사용해봤었죠? " " 공백을 기준으로 쪼개서 배열로 만들어 줍니다! [Character] 타입입니다. 

7) .map { Int(String($0)) } : 앞서 사용해봤었죠? [Character] 타입 배열을 [Int] 타입으로 변환해 줍니다. 이제 X를 기준으로 X미만의 값만 추려내면 됩니다. 한마디로 "filtering" 하면 되겠죠?

8) .filter { $0 < X } : filter 고차함수는 특정 조건을 충족하는 원소만 추려내서 다시 배열을 만듭니다. $0 < X의 조건을 충족하는 원소만 필터링되어 남게 됩니다. 여전히 타입은 [Int]입니다.

9) .map { "\($0)" } : 다시 맵핑을 하고 있습니다. map 고차함수는 기존의 값들을 특정 연산 후의 값으로 매핑시켜줍니다. "\()"로 값을 감싸주면 Int -> String 타입이 됩니다. 이렇게 값은 [String] 타입이 됩니다. 

10) .joined(separator: " ") : 해당 메서드는 문자열배열을 하나의 문자열로 합쳐주는 메서드인데요. 저흰는 배열의 값을 공백 단위로 출력해주어야 합니다. 그럴때는 joined(separator:) 메서드의 separator: 인자에 " " 를 넣어주면 됩니다. 

joined() 라고만 사용할 수도 있습니다. 하지만, 그렇게 되면 공백없는 문자열로 변형됩니다.

 

-> 그렇게 최종적으로 우리가 원하던 결과가 나왔습니다. "1 4 2 3", 찾고가 했던 답이 도출되었습니다. 그렇게 제출결과는 아래와 같습니다.

 

 

 

 

 

 


함수형 패러다임 언어이기도한 스위프트언어로 알고리즘문제를 푸신다면 이런 함수형으로 병행해서 문제를 풀어보는 것도 좋은것 같습니다.
이따금씩 스위프트문제를 풀때 고차함수를 활용해서 문제를 풀어보도록 하겠습니다. 👨🏻‍💻

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함