소피it블로그

[Swift] 코딩테스트로 스위프트 공부하기 - 반복문 (1) 본문

개발_iOS/코딩테스트로 스위프트 공부하기

[Swift] 코딩테스트로 스위프트 공부하기 - 반복문 (1)

sophie_l 2022. 4. 6. 23:36

1. A + B

https://www.acmicpc.net/problem/10950

 

10950번: A+B - 3

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

어려울 것 없는 문제이고, 짚고 가고 싶은 부분이 딱 두 군데 있다.

우선 빈 배열에 요소를 추가하고 싶으면 초기화를 먼저 해줘야한다는 것. 당연한 것인데 코드를 작성할 때 까먹었기 때문에 확인차 적어둔다.

초기화하지 않은 배열에 요소를 추가하려고 할 때 생기는 오류

별 생각 없이 var sumArr: [Int]라고 타입을 명시해주면 당연히 제대로 작동할 것이라고 생각했는데 크나큰 착각이었다. 초기화를 해주지 않았던 것.

빈 배열을 초기화해줄 땐

var emptyArr1: [Int] = []
var emptyArr2 = Array<Int>()
var emptyArr3 = [Int]()

를 기억하자.

참고자료: https://axe-num1.tistory.com/19

 

Swift - Array ) 배열의 기초

스위프트는 튜플 외에도 많은 수의 데이터를 묶어서 저장하고 관리할 수 있는 컬렉션 타입을 제공합니다. 컬렉션 타입에는 '배열', '딕셔너리', '세트'가 있습니다. Array (배열) - 멤버가 순서를 가

axe-num1.tistory.com

완성된 코드

또 하나 더 짚고 갈 부분은 배열에 요소를 추가하는 부분이다. 아주 간단히

emptyArr1.append(1)

라고 해주면 된다.


2. A + B 다른 버전

https://www.acmicpc.net/problem/11021

 

11021번: A+B - 7

각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.

www.acmicpc.net

같은 문제인데 위의 경우 입력을 한번에 받고 한번에 출력하는 코드로 작성한 반면, 이 경우 입력 한 번 받으면 바로 출력을 해주는 형식으로 했다. 본질적인 차이는 없고 둘 중 어느 것을 선택해도 큰 문제는 없는듯. 인풋 데이터를 한 번에 주고 싶으면 위처럼, 반복문을 한 번만 쓰고 싶으면 아래처럼 하면 될듯.

 

그냥 참고 정도로만


3. 별 찍기

https://www.acmicpc.net/problem/2438

 

2438번: 별 찍기 - 1

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

www.acmicpc.net

파이썬에서라면 고민할 것도 없는 간단한 문제였겠지만 스위프트에서는 String * Integer가 되지 않기 때문에 약간의 고민이 있었다. 두 가지 방법으로 풀어보았는데, 첫 번째에선 별을 한 줄에 Int개만큼 출력하기 위한 함수를 따로 만들어서 이를 for문에 넣어주기로 하였다. 그러나 스위프트의 경우 print함수를 사용하면 자동 줄바꿈이 되기 때문에 이를 해제하는 기능을 찾아야 했다.

print("example", terminator: "")

위와 같은 방법으로 줄바꿈 없이 출력할 수 있었다. 다만 마지막 별 문자 뒤에는 줄바꿈이 되어야 하기 때문에 (1) 별이 한 개일 때와 그렇지 않은 때를 구별하였고, (2) 별이 여러개인 경우 마지막 별은 terminator를 적용하지 않았다.

약간은 길어진 코드

두 번째 풀이는 다음 문제를 풀면서 생각해낸 풀이인데 훨씬 간단하다. 스트링을 정수만큼 곱해주는 대신, 빈 스트링을 만들어두고 for 문을 한 번씩 돌 때마다 별표를 append해주면 되는 것. append해주면 이미 별이 있는 스트링에 새로운 별 하나만 붙이면 되기 때문에 스트링과 정수의 곱셈을 걱정할 필요가 없고, append 후에 즉각 프린트를 하기 때문에 줄바꿈 제거로 고민할 필요가 없었다.

훨씬 간단한 풀이. 진작 생각해내지 못한게 한스럽다

그렇지만 정작 다음 문제는 두 번째 방법으로는 못풀었다는 게 아이러니다. 첫 번째 방법에 공백을 프린트해주는 함수를 추가하여 작성했는데, 두 번째 방법으로도 풀 수 있을지 고민해봐야겠다.


4. X보다 작은 수

https://www.acmicpc.net/problem/10871

 

10871번: X보다 작은 수

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

www.acmicpc.net

이 문제는 총 세 가지 방법으로 풀었다. separator를 사용한 방법 두 가지, terminator를 사용한 방법 한 가지

우선 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

 

Convert an array of Ints to a comma separated string

I know that if I want to convert an array of Ints to a String, I do this: [0,1,1,0].map{"\($0)"}.reduce(""){$0+$1} but I cannot figure out how would I convert an array of Ints to a comma separated

stackoverflow.com

엄청나게 멋진 풀이는 아니지만 map 사용에 의의를 두며

map을 사용하여 Int의 배열인 ansArray의 요소들을 한번에 스트링화하여, 그 결과인 스트링의 배열을 " "로 조인해주는 방법. 크리티컬한 차이가 있는 것은 아니지만 맵 함수를 썼다는 점에 의의가 있다고 본다.

 

두 문제가 남았지만 오늘은 여기까지