[Swift/프로그래머스] 코딩 기초 트레이닝 5~8번 문제 풀이

sonny·2024년 10월 26일
1

TIL

목록 보기
22/48

기분탓인지 모르겠지만 어제보단 쉬운 느낌? 오늘 일단 4개만 풀고 일요일에 좀 많이 풀어볼까 한다.

5. 특수문자 출력하기

나의 답)

import Foundation

print(#"!@#$%^&*(\'"<>?:;"#)

검색해보니 특수문자를 프린트하려면 양 옆에 "#" 이 들어가야한다고 한다.
바로 해보니 출력 깔끔하게 완료되었다.


6. 덧셈식 출력하기

나의 답)

import Foundation

let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
let (a, b) = (n[0], n[1])

print ("\(a) + \(b) = \(a + b)")

덧셈식 출력하기도 꽤 간단했다. \( ) 안에 잘 넣어주니 정답이었다.


7. 문자열 붙여서 출력하기

나의 답)

import Foundation

let inp = readLine()!.components(separatedBy: [" "]).map { $0 }
let (s1, s2) = (inp[0], inp[1])



print("\(s1)\(s2)")

문자열 붙여서 출력하라는게 처음에 그냥 이어서 쓰라는건가? 근데 그게 맞음 쉽다 쉬워


8. 문자열 돌리기

나의 답)

import Foundation

let s1 = readLine()!

s1.forEach {
    print($0)   
}

이건 그냥 반복문으로 해서 돌리면 되겠는데? 하고 for-in 문으로 쓰려고 하다가 문득 foreach 문을 배웠던게 기억났다.

이번 프로젝트에서도 잠깐 보았지만 foreach 문을 사용하면 같은 반복문이더라도 훨씬 짧게 줄여줬던게 생각이 났고 적용했다.

forEach 문에서는 breakcontinue 를 사용할 수 없다는걸 기억하자. forEach 는 모든 요소를 하나씩 처리하는 동작에 최적화된 메서드이기 때문에 반복 중간에 멈추거나 건너뛰는 기능이 없다.

만약 반복을 중단하거나 특정 조건을 건너뛰고 싶을 때는 코드를 forEach 대신 for-in 문으로 사용해야 한다.

그리고 $0 은 첫번째 Array 라고 했던 기억이나서 그냥 프린트 해보자! 하고 했는데 정말 됐다..

알아온 설명을 덧붙이자면,

$0 은 Swift에서 forEach 나 클로저에서 사용되는 "위치 인자 "(positional argument) 라는 것인데 함수나 클로저 내에서 호출된 파라미터의 순서를 나타낸다.

forEach 에서 Array 의 각 요소를 순서대로 접근할 때, forEach 의 클로저는 기본적으로 한 개의 인자를 받는다. 따라서 forEach 내부에서는 첫 번째 인자를 $0 으로 접근하는 것이다.

그리고 꼭 foreach 문에서만 사용되는 것도 아니다. 다른 클로저에서도 사용 가능한데, 예를 들어 map을 사용해본다고 해보자.

let fruits = ["apple", "orange", "banana"]

let uppercasedFruits = fruits.map { $0.uppercased() }
print(uppercasedFruits)  // ["APPLE", "ORANGE", "BANANA"]

여기서도 $0fruits 배열의 현재 요소를 가리키고 있고, map 은 배열의 각 요소를 가져와서 새로운 값으로 바꿔주는 역할을 한다. 해당 코드의 경우 각 요소를 대문자로 바꿔주고 있는 것이다.

numbers.map { $0 * 2 } 와 같이 $0 사용하여 클로저 안에서 $0 는 인자의 이름을 직접 쓰지 않아도 첫 번째 인자를 가져올 수 있는 간단한 방법이다.


음...

오늘 프로그래머스 문제를 풀다 마지막 문제에서 forEach 문을 사용하여 문제를 해결한 부분이 기억에 남는다. 기존에는 주로 for-in 문을 사용해 요소를 순회했었는데, 이번에는 forEach 를 활용하면서 조금 더 간결한 코드 작성의 장점을 경험하게 된 듯 하다.

forEach 는 코드가 간결해지는 장점이 있지만 반복 중간에 breakcontinue 를 사용할 수 없다는 제한도 함께 있다는 것을 깨달았다.

덕분에 forEach가 모든 요소를 한 번씩 처리할 때 유용하다는 점, 그리고 특정 조건에서 반복을 중단해야 하는 경우에는 for-in 이 더 적합할 수 있다는 점을 다시 한번 되새겨볼 수 있었다.

처음에는 forEach 내에서 $0 와 같은 표현이 익숙하지 않았지만, $0 이 클로저의 첫 번째 인자를 나타내며 현재 요소를 간단히 참조할 수 있다는 점을 익히고 나서는 코드가 훨씬 깔끔해졌다.

앞으로 클로저를 사용할 때 필요하지 않은 경우에는 굳이 인자 이름을 명시하지 않고 $0 를 활용하는 것이 더 좋겠다는 생각이 들었다. 근데 이것도 막상 쓰려면 생각이 나질 않더라.

이번 경험을 통해 코드가 더 읽기 쉬워질 수 있도록 상황에 맞게 forEachfor-in 을 구분하여 사용하는 연습을 계속 해보려 한다.

forEach 는 모든 요소를 순회할 때 쓰면 좋을 것이고.. 다음에는 아주 잠깐 공부했었던 map , filter 같은 다른 고차 함수와도 함께 활용해서 다양한 코딩문제를 풀어보고 싶다.

profile
iOS 좋아. swift 좋아.

4개의 댓글

comment-user-thumbnail
2024년 10월 26일

아닛?! 내가 날짜를 착각했나???

1개의 답글
comment-user-thumbnail
2024년 10월 28일

for-in과 forEach의 차이점을 정리하신 게 인상 깊네요. 저는 그냥 둘다 반복문이라고만 대애충 기억하고 넘겼는데.. break나 continue 필요 시 for-in 기억하겠습니다. 그리고 첫번째 문제 풀이 양옆에 # 붙이는 거 처음 알았어요! swift에 저런 게 있었다니

답글 달기