소피it블로그
[Swift] 코딩테스트로 스위프트 공부하기 - 반복문 (1) 본문
1. A + B
https://www.acmicpc.net/problem/10950
어려울 것 없는 문제이고, 짚고 가고 싶은 부분이 딱 두 군데 있다.
우선 빈 배열에 요소를 추가하고 싶으면 초기화를 먼저 해줘야한다는 것. 당연한 것인데 코드를 작성할 때 까먹었기 때문에 확인차 적어둔다.
별 생각 없이 var sumArr: [Int]라고 타입을 명시해주면 당연히 제대로 작동할 것이라고 생각했는데 크나큰 착각이었다. 초기화를 해주지 않았던 것.
빈 배열을 초기화해줄 땐
var emptyArr1: [Int] = []
var emptyArr2 = Array<Int>()
var emptyArr3 = [Int]()
를 기억하자.
참고자료: https://axe-num1.tistory.com/19
또 하나 더 짚고 갈 부분은 배열에 요소를 추가하는 부분이다. 아주 간단히
emptyArr1.append(1)
라고 해주면 된다.
2. A + B 다른 버전
https://www.acmicpc.net/problem/11021
같은 문제인데 위의 경우 입력을 한번에 받고 한번에 출력하는 코드로 작성한 반면, 이 경우 입력 한 번 받으면 바로 출력을 해주는 형식으로 했다. 본질적인 차이는 없고 둘 중 어느 것을 선택해도 큰 문제는 없는듯. 인풋 데이터를 한 번에 주고 싶으면 위처럼, 반복문을 한 번만 쓰고 싶으면 아래처럼 하면 될듯.
3. 별 찍기
https://www.acmicpc.net/problem/2438
파이썬에서라면 고민할 것도 없는 간단한 문제였겠지만 스위프트에서는 String * Integer가 되지 않기 때문에 약간의 고민이 있었다. 두 가지 방법으로 풀어보았는데, 첫 번째에선 별을 한 줄에 Int개만큼 출력하기 위한 함수를 따로 만들어서 이를 for문에 넣어주기로 하였다. 그러나 스위프트의 경우 print함수를 사용하면 자동 줄바꿈이 되기 때문에 이를 해제하는 기능을 찾아야 했다.
print("example", terminator: "")
위와 같은 방법으로 줄바꿈 없이 출력할 수 있었다. 다만 마지막 별 문자 뒤에는 줄바꿈이 되어야 하기 때문에 (1) 별이 한 개일 때와 그렇지 않은 때를 구별하였고, (2) 별이 여러개인 경우 마지막 별은 terminator를 적용하지 않았다.
두 번째 풀이는 다음 문제를 풀면서 생각해낸 풀이인데 훨씬 간단하다. 스트링을 정수만큼 곱해주는 대신, 빈 스트링을 만들어두고 for 문을 한 번씩 돌 때마다 별표를 append해주면 되는 것. append해주면 이미 별이 있는 스트링에 새로운 별 하나만 붙이면 되기 때문에 스트링과 정수의 곱셈을 걱정할 필요가 없고, append 후에 즉각 프린트를 하기 때문에 줄바꿈 제거로 고민할 필요가 없었다.
그렇지만 정작 다음 문제는 두 번째 방법으로는 못풀었다는 게 아이러니다. 첫 번째 방법에 공백을 프린트해주는 함수를 추가하여 작성했는데, 두 번째 방법으로도 풀 수 있을지 고민해봐야겠다.
4. X보다 작은 수
https://www.acmicpc.net/problem/10871
이 문제는 총 세 가지 방법으로 풀었다. separator를 사용한 방법 두 가지, terminator를 사용한 방법 한 가지
우선 terminator를 사용한 방법부터 보자.
숫자가 x보다 작으면 즉시 프린트하되 터미네이터를 " "로 설정하여 다음 숫자가 줄바꿈 없이 띄어쓰기 되도록 하였다. 그런데 이 방법은 마지막에 스페이스가 붙기 때문에 틀릴지도 모른다고 생각했는데 다행히 오류 없이 정답 처리되었다.
두 번째와 세 번째 방법은 둘 다 separator를 사용해줬다는 공통점이 있다. 굳이 두 번이나 코드를 고쳐본 것은 Int의 배열을 스트링으로 조인하는 법을 몰라서 헤매는 과정이서 두 가지 해법이 생각났기 때문.
처음에는 ansArray에 Int값 자체를 append한 후 최종적으로 그 정수값들을 스트링으로 join하려고 했다. 그러나 찾아본 결과 (확실치는 않지만) 파이썬에서와 다르게 스트링값이 아닌 정수값을 내포하는 배열의 경우 바로 스트링으로 조인해줄 수 없는 것 같았다. 보통 익스텐션을 쓰는 듯. 그러나 나는 익스텐션을 아직 잘 모르기 때문에 다른 방법을 고민해봤고, 우선 ansArray를 Int의 배열이 아닌 String의 배열로 만들어서 숫자가 x보다 작은 경우 그 숫자를 String화하여 ansArray에 붙여주는 방법을 생각했다. 그게 위에 구현된 방법이다. 마지막에는 String의 배열을 " "로 조인하여 프린트해주었다.
그렇지만 분명 더 좋은 방법이 있을 것 같아 고민해본 결과, 익스텐션은 아직 건드릴 엄두가 안 났고 ansArray를 Int의 배열로 해준 후, map 함수를 사용하여 그 내부의 정수값들을 스트링화한 뒤에 " "로 조인하는 방법을 찾아냈다.
참고한 사이트: https://stackoverflow.com/questions/43774352/convert-an-array-of-ints-to-a-comma-separated-string
map을 사용하여 Int의 배열인 ansArray의 요소들을 한번에 스트링화하여, 그 결과인 스트링의 배열을 " "로 조인해주는 방법. 크리티컬한 차이가 있는 것은 아니지만 맵 함수를 썼다는 점에 의의가 있다고 본다.
두 문제가 남았지만 오늘은 여기까지
'개발_iOS > 코딩테스트로 스위프트 공부하기' 카테고리의 다른 글
[Swift] 코딩테스트로 스위프트 공부하기 - 1차원 배열 (1) (0) | 2022.04.16 |
---|---|
[Swift] 코딩테스트로 스위프트 공부하기 - 입출력과 사칙연산 (2), 조건문 (0) | 2022.04.06 |
[Swift] 코딩테스트로 스위프트 공부하기 - 입출력과 사칙연산 (1) (0) | 2022.04.04 |