소피it블로그
[Swift] 코딩테스트로 스위프트 공부하기 - 입출력과 사칙연산 (1) 본문
나에게 맞는 스위프트 공부법을 아직 찾아가는 단계이다.
100 Days of Swift로 기초 문법은 한번 간단히 보긴 했는데 그 후가 문제였다. 문법 파트가 끝나고 새로 시작하는 프로젝트들은 왜 하는 것인지 잘 와닿지 않기도 했고 무엇보다 가장 큰 문제는, 나는 정말 아무것도 모르는 초짜중의 왕초짜인데 해당 강의는 2,3 년 전 것이라 그 사이에 xcode ui가 좀 변경된 것 같았다. 아무리 해도 영상에서 말하는 버튼이나 구역을 못 찾겠어서 고민을 하면서 시간을 보냈다.
"되든 안 되든 우선 뭔가를 자꾸 써보고 만들어보자." 이게 내가 내린 결론이다. 아직은 너무나도 초보라 허접할 수 밖에 없는 수준이지만, 허접하게나마 개인 프로젝트를 시작하고 나면 상상한 것을 구현해보려고 노력하는 과정에서 배울 것이 많겠지 싶은 마음이다. 디자인툴도 코딩도 직접 해보면서 그때그때 채워나가면 언젠가는 채워지지 않을까 하는 생각. 실패하면서 배우는 것이다. 매일 도전하고 실패, 혹은 성공하는 과정에서 배운 것이 있다면 블로그에 짧게나마 기록을 남기려고 한다. 그러려고 만든 블로그이기도 하고.
그와는 별개로 이왕이면 코딩테스트 문제들을 풀어보며 자료구조/알고리즘 공부와 스위프트 작성 연습을 함께 하면 어떨까 하는 생각이 들었다. 파이썬으로는 풀어본 적이 꽤 있었는데(어려운 것들은 그나마도 못 풀었지만) 스위프트는 새로 배운 언어이기도 하고 훨씬 생소한 상태니까 쉬운 문제들부터 차근차근 풀어보다보면 새로 깨우치는 것도 많지 않을까 하는 생각이다. 그래서 나는 백준 단계별로 풀어보기를 가장 쉬운 단계부터 하루에 적게는 한 문제씩이라도 꼭 풀어보며 공부해야겠다고 결심했다. 문제를 풀고 스위프트 문법적인 측면이든 자료구조/알고리즘 측면이든 새로 배우는 게 있으면 블로그에 적어두어야겠다. 오늘부터 시작.
1. 고양이 문제
https://www.acmicpc.net/problem/10171
바로 성공한 파이썬에서와 다르게 수많은 컴파일 에러 끝에 찾아낸 해답. 그것은 바로 이스케이프 문자의 사용이었다.
var cat: String = """
\\ /\\
) ( ')
( / )
\\(__)|
"""
print(cat)
스위프트에서는 여러 줄에 걸친 문자열을 """
과
"""
사이에 써주는데, 이때 \를 사용하면 여러줄로 출력하는 대신 한 줄로 출력하게 된다. 따라서 백슬래시 그 자체를 출력하려고 하면 이스케이프를 시켜줘야 하기 때문에 \를 한번 더 써줘서 백슬래시를 리터럴한 의미로 사용하였다.
또한, String Interpolation \()에 해당하는 기호가 있기 때문에 역시나 리터럴한 의미의 백슬래시 사용을 위해 \를 써서 이스케이프 시켜준다.
다음 문제인 개 문제도 역시 비슷하게 풀 수 있을 듯.
https://it-adventures.tistory.com/2
3, 4번 항목 참조
2. A + B
https://www.acmicpc.net/problem/1000
문제 자체는 굉장히 쉽지만 input()으로 간단하게 사용자 입력을 받아오던 파이썬과 달리 스위프트에서는 입력을 받는 것에서부터 난항을 겪었다.
해결책을 찾아본 결과 readLine 함수를 사용하면 된다는 것을 알아냈는데, 플레이그라운드로는 실행이 안되므로 xcode - 프로젝트- mac os - command line tool로 새 파일을 생성해줘야 한다고 한다.
그 후엔 어떻게 하면 되나?
https://developer.apple.com/documentation/swift/1641199-readline/
애플 디벨로퍼 사이트에서 찾아본 결과 readLine 함수를 사용하면 결괏값으로 옵셔널 스트링이 나온다.
그렇다면 옵셔널을 언래핑해줘야 하는데 강제 언래핑은 위험이 큰 방법이라 지양하는 게 맞지만, 코딩 문제풀이용으로는 정상적인 값이 입력된다는 것을 전제로 강제 언래핑을 해주는 것이 나을 수 있다(시간 절약의 측면에서).
let nums = readLine()! // 사용자 입력을 강제 언래핑해서 String으로 받아줌
let numsArray: [Int] = nums.split(separator: " ").map{ Int($0)! }
/*
.split(separator: )로 문자열을 separator 기준으로 split해줄 수 있고, 각각을 Int로 형변환 맵핑을 해준다.
!는 왜 붙는지 아직 잘 모르겠음 -> Int($0)의 값 또한 옵셔널이기 때문에 언래핑을 해줘야 하는 것
*/
print(numsArray[0] + numsArray[1])
더 효율적인 코드가 없을지 고민해봐야겠다. 특히 array의 sum을 구하는데 있어 더 좋은 방법이 뭐일지.
A, B = map(int, input().split())
print(A + B)
이렇게 짧고 간단하게 끝나던 파이썬과 너무 비교되는 느낌🥲
스위프트로 알고리즘 문제 풀기 관련하여 도움이 되는 게시물이 있어서 링크를 단다. (이 문제 풀이 작성에도 참고하였음) https://0urtrees.tistory.com/94
하여튼 우선은 같은 방법으로 사칙연산 문제들을 다 풀어보았다.
다만 나눗셈의 경우 Double로 해야 소숫점 이하까지 정확하게 구할 수 있을 것 같아 더블로 구현해주었고, 무리 없이 정답처리되었다.
let doubArr = readLine()!.split(separator: " ").map{ Double($0)! }
print(doubArr[0] / doubArr[1])
3. 태국 달력 문제
https://www.acmicpc.net/problem/18108
이 문제에서는 사용자 입력값에 숫자가 하나만 들어있기 때문에 Int(readLine()!)을 해주는데, 이 또한 옵셔널이 나오기 때문에 - 543 연산을 해주려면 강제 언래핑이 선행되어야 한다.
print(Int(readLine()!)! - 543)
눈이 아프기도 하고 졸음이 쏟아지는 관계로 마지막 한 문제는 남겨두고 오늘은 여기까지.
'개발_iOS > 코딩테스트로 스위프트 공부하기' 카테고리의 다른 글
[Swift] 코딩테스트로 스위프트 공부하기 - 1차원 배열 (1) (0) | 2022.04.16 |
---|---|
[Swift] 코딩테스트로 스위프트 공부하기 - 반복문 (1) (0) | 2022.04.06 |
[Swift] 코딩테스트로 스위프트 공부하기 - 입출력과 사칙연산 (2), 조건문 (0) | 2022.04.06 |