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

sonny·2024년 10월 25일
3

TIL

목록 보기
21/52
post-thumbnail

오늘 프로그래머스로 위 문제 4개를 풀어보고 풀이를 기록해보려한다.


1. 문자열 출력하기

나의 답)

import Foundation

let s1 = readLine()!
print(s1)

문제를 봤을 때 이미 readLine()! 까지 적혀있어서 print(s1) 만 작성하면 끝나는 간단한 문제였다.


2. a와 b출력하기

나의 답)

import Foundation

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

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

위 문제와 마찬가지로 print 구문만 작성하여 해당 문제도 해결.


3. 문자열 반복해서 출력하기

나의 답)

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 를 빈 문자열로 설정했다. 이걸로 같은 줄에 여러 번 출력할 수 있다.


4. 대소문자 바꿔서 출력하기

나의 답)

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.isUppercasetrue 일 때 i.lowercased() 를 실행해 소문자로 변환하고,
    i.isUppercasefalse 일 때는 i.uppercased() 를 실행해 대문자로 변환하는 것.

i.lowercased()와 i.uppercased()

  • i.lowercased() : i 를 소문자로 변환해 반환한다. (예: "A".lowercased()는 "a")
  • i.uppercased() : i 를 대문자로 변환해 반환한다. (예: "a".uppercased()는 "A")

이 구조를 적용하면, i 가 대문자일 때는 소문자로, 소문자일 때는 대문자로 변환할 수 있게 된다.

만약 i가 "H"라면 , i.isUppercasetrue 이므로 i.lowercased() 가 실행되어 "h" 가 될 것이고

i가 "e"라면 ,i.isUppercasefalse 이므로 i.uppercased() 가 실행되어 "E" 가 될 것이다.

이렇게 모든 문자가 조건에 따라 변환된 후 result 에 추가되면서 최종적으로 대소문자가 뒤바뀐 문자열을 만들 수 있다!


음...

오늘 팀원의 추천으로 프로그래머스라는 홈페이지에서 기초 코딩 문제를 풀며 코딩 테스트라는 것에 대해 배울 수 있었던 것 같다. 특히 마지막 문제에서는 풀이가 어려워 검색을 많이 했는데, 덕분에 삼항 연산자와 문자열 연결 방법을 활용해 조건에 따라 다른 처리를 하는 코드 작성법을 알게 됐고 혼자 반복해서 연습할 수 있어 좋았다.

처음 문제를 접했을 때는 꽤 간단해 보였지만, 세부적인 코드 구조를 작성하는 과정에서 조건문과 문자열 변환 메서드 사용법에 대해 깊이 생각해야 했어서 시간이 많이 소요된 듯 싶다.

그래도 += 를 사용해 결과를 누적하고, isUppercase 와 같은 속성을 활용해 대소문자를 판별하는 구성을 배운 것이 특히 기억에 남아서 좋았다.

또 이번 문제들을 풀며 작은 로직 하나하나에도 이유가 있고, 코드가 완성되기까지 필요한 과정이 많다는 점을 깨달았다.

앞으로도 이런 문제들을 꾸준히 해결 해보면서 논리적 사고와 코딩 실력을 더 다져나가야겠다고 느꼈고 제일 좋은건 문제를 풀면 자동으로 커밋이 되니 잔디를 채우는 것은 덤이라 아주 흡족한 하루였다.

profile
iOS 좋아. swift 좋아.

7개의 댓글

comment-user-thumbnail
2024년 10월 25일

방금 전은 못참지 선 댓글 후 감상😏

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

론겸씨 벌써 알고리즘을 시작하시다니 앞서나가시는군요

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

결과를 저장할 빈값을 선언하는 걸 그릇 역할이라고 표현하니깐 확 와닿네요!

1개의 답글