오늘 프로그래머스로 위 문제 4개를 풀어보고 풀이를 기록해보려한다.
나의 답)
import Foundation
let s1 = readLine()!
print(s1)
문제를 봤을 때 이미 readLine()! 까지 적혀있어서 print(s1) 만 작성하면 끝나는 간단한 문제였다.
나의 답)
import Foundation
let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
let (a, b) = (n[0], n[1])
print("a = \(a)")
print("b = \(b)")
위 문제와 마찬가지로 print 구문만 작성하여 해당 문제도 해결.
나의 답)
import Foundation
let inp = readLine()!.components(separatedBy: [" "]).map { $0 }
let (s1, a) = (inp[0], Int(inp[1])!)
for i in 0..<a {
print(s1, terminator: "")
}
let (s1, a) = (inp[0], Int(inp[1])!)
까지는 이미 적혀있었다. 아래의 반복문 작성했는데,
for i in 0..<a
를 사용하여 0
부터 a - 1
까지 반복하는 구조로, a
번 반복할 수 있게 해주었다.
print(s1, terminator: "")
를 사용하여 문자열 s1
을 출력하고, 출력 후 개행을 하지 않도록 terminator
를 빈 문자열로 설정했다. 이걸로 같은 줄에 여러 번 출력할 수 있다.
나의 답)
import Foundation
let s1 = readLine()!
var result = ""
for i in s1 {
result += (i.isUppercase ? i.lowercased() : i.uppercased())
}
print(result)
이 문제는 isUppercase
,lowercased
메서드를 아는지 확인하는 그런 문제 같았다. 결론적으로 메서드를 모르면 못 풀기에 열심히 구글로 검색해보니 쉽게 알 수 있어서 풀게 되었는데 나중에 또 까먹을 수 있으니 왜 이렇게 했는지 적어보려한다.
result = ""
는 결과를 저장할 빈 문자열을 초기화하는 코드인데, 문자열을 순회하면서 변환된 문자를 하나씩 result
에 추가할 수 있도록 빈 문자열로 시작하는 것이다.
왜 비워두는지 더 자세히 설명하자면 초기 상태 설정을 해줘야해서 그런 것인데, 변환된 문자를 계속해서 더할 변수(result)
가 필요한 상황이니 처음에는 아무것도 없으므로 빈 문자열로 초기화해 시작하기 때문이다. 이 빈 문자열은 변환된 결과를 모아두는 "그릇
" 같은 역할을 한다.
그리고 for
반복문을 통해 각 문자를 변환하고 그 문자를 result
에 하나씩 추가(+=)
해 나가는 방식이라 이렇게 빈 문자열로 시작하면 변환된 문자들을 차례대로 누적해갈 수 있다.
예를 들어, s1
에 "Hello"
를 넣으면 "hELLO"
로 대소문자가 바뀌어 result
에 저장될 것이다.
+=
연산자는 문자열을 합치는데 사용되는 연산자인데, result += ...
는 result
에 새로운 문자열을 계속해서 추가하는 방식으로 작동된다.
이 +=
연산자를 사용하는 이유는 문자열을 연결하며 result
에 변환된 문자를 계속해서 추가하기 위해 사용했다. 처음에는 result
가 빈 문자열이고, 반복문을 통해 변환된 각 문자를 차례로 추가하게 되는 것.
그리고 result += (i.isUppercase ? i.lowercased() : i.uppercased())
라는 표현은 result
에 현재 문자의 대소문자를 변환한 결과를 계속해서 더하는 의미이다. 변환된 문자가 result
에 누적되도록 해주는 것.
예를 들어 s1
이 "Hello"
라면
첫 번째 반복에서 result
는 "" + "h"
가 되어 "h"
가 될 것이고,
두 번째 반복에서 result
는 "h" + "E"
가 되어 "hE"
가 된다.
이런 식으로 반복해서 "hELLO"
가 최종 결과가 나온다.
결과적으로 +=
연산자는 문자열을 이어 붙여 하나의 최종 문자열을 만드는 데 필수적인 역할을 한다고 보면 된다.
(i.isUppercase ? i.lowercased() : i.uppercased())
이 부분은 삼항 연산자를 이용해 조건에 따라 값을 다르게 선택하는 방식이다. 삼항연산자를 배운 것을 써먹을 수 있어서 좋았다.
여기서는 i
가 대문자인지 소문자인지를 확인하고, 그에 따라 i
를 소문자 또는 대문자로 변환해 result
에 추가하는 역할을 한다.
자세히 설명하자면,
i.isUppercase
: i
가 대문자인지 확인하는 조건인데, isUppercase
는 대문자인 경우 true, 소문자인 경우 false를 반환한다.
삼항 연산자 ?
: 삼항 연산자는 조건에 따라 두 가지 값 중 하나를 선택한다.
i.isUppercase
가 true
일 때 i.lowercased()
를 실행해 소문자로 변환하고,
i.isUppercase
가 false
일 때는 i.uppercased()
를 실행해 대문자로 변환하는 것.
i.lowercased()와 i.uppercased()
i.lowercased()
: i
를 소문자로 변환해 반환한다. (예: "A".lowercased()는 "a
")i.uppercased()
: i
를 대문자로 변환해 반환한다. (예: "a".uppercased()는 "A
")이 구조를 적용하면, i
가 대문자일 때는 소문자로, 소문자일 때는 대문자로 변환할 수 있게 된다.
만약 i
가 "H"라면 , i.isUppercase
가 true
이므로 i.lowercased()
가 실행되어 "h"
가 될 것이고
i가 "e"라면 ,i.isUppercase
가 false
이므로 i.uppercased()
가 실행되어 "E"
가 될 것이다.
이렇게 모든 문자가 조건에 따라 변환된 후 result
에 추가되면서 최종적으로 대소문자가 뒤바뀐 문자열을 만들 수 있다!
오늘 팀원의 추천으로 프로그래머스라는 홈페이지에서 기초 코딩 문제를 풀며 코딩 테스트라는 것에 대해 배울 수 있었던 것 같다. 특히 마지막 문제에서는 풀이가 어려워 검색을 많이 했는데, 덕분에 삼항 연산자와 문자열 연결 방법을 활용해 조건에 따라 다른 처리를 하는 코드 작성법을 알게 됐고 혼자 반복해서 연습할 수 있어 좋았다.
처음 문제를 접했을 때는 꽤 간단해 보였지만, 세부적인 코드 구조를 작성하는 과정에서 조건문과 문자열 변환 메서드 사용법에 대해 깊이 생각해야 했어서 시간이 많이 소요된 듯 싶다.
그래도 +=
를 사용해 결과를 누적하고, isUppercase
와 같은 속성을 활용해 대소문자를 판별하는 구성을 배운 것이 특히 기억에 남아서 좋았다.
또 이번 문제들을 풀며 작은 로직 하나하나에도 이유가 있고, 코드가 완성되기까지 필요한 과정이 많다는 점을 깨달았다.
앞으로도 이런 문제들을 꾸준히 해결 해보면서 논리적 사고와 코딩 실력을 더 다져나가야겠다고 느꼈고 제일 좋은건 문제를 풀면 자동으로 커밋이 되니 잔디를 채우는 것은 덤이라 아주 흡족한 하루였다.
방금 전은 못참지 선 댓글 후 감상😏