TIL

18일차 TIL

h_luz 2024. 3. 21. 21:04

 

Swift 알고리즘 및 언어공부

 

//42. 이상한 문자 만들기
import Foundation
func solution(_ s:String) -> String {
    var divS = s.components(separatedBy:" ")
    var cnt:Int = 0
    var value:String = ""
    var resultS:String = ""

    for n in 0 ..< divS.count{
        for i in divS[n] {
            if cnt == 0 || cnt % 2 == 0 {
                value = String(i)
                resultS.append(value.uppercased())
            } else {
                value = String(i)
                resultS.append(value.lowercased())
            }
            cnt += 1
        }
        //마지막엔 띄어쓰기 생략
        if n == divS.count - 1 {
            break
        } else {
            resultS.append(" ")
            cnt = 0
        }
    }
    return resultS
}

ㅎ ㅏ 길다.. 역시 뒤로 갈수록 알고리즘 난이도가 올라가는구나.. ㅠㅠ 어제도 어려웠는데,, 그래도 풀어냈으니 다행 !

 

우선 Components 함수를 다시 공부할 수 있었다 ! (아마 16일 차 TIL에 있을 것..)

 

그리고 새롭게 알게 된 uppercased()와 lowcased()

이 함수가 있으면 간단하게 대소문자를 변경할 수 있다.

 

Uppercased()

: 문자열을 대문자로 변환해 주는 함수 (공식문서 참고)

let cafe = "Cafe"
print(cafe.uppercased()) // "CAFE" 출력

 

lowcased()

: 문자열을 소문자로 변환해 주는 함수

let cafe = "BBQ Café"
print(cafe.lowercased()) // "bbq café" 출력

 


 

//다른사람의 풀이
import Foundation
func solution(_ s:String) -> String {
    let a = s.components(separatedBy: " ").map { $0.enumerated().map { $0.offset % 2 == 0 ? $0.element.uppercased() : $0.element.lowercased() } }
    return a.map{ $0.map { $0 }.joined() }.joined(separator: " ")
}

이렇게 줄여놓은 코드를 보면 머리가 아픈데.. 왜 짧은 코드를 선호하는 건지... ㅏ하핫..

하나씩 풀어서 해석해 봐야겠다

 

우선 

enumerated()참조사이트, 참조사이트2 )

: 쌍의 시퀀스( n , x )를 반환합니다. 여기서 n은 0에서 시작하는 연속 정수를 나타내고, x는 시퀀스의 요소를 나타냅니다.

for (n, c) in "Swift".enumerated() {
    print("\(n): '\(c)'")
}
// Prints "0: 'S'"
// Prints "1: 'w'"
// Prints "2: 'i'"
// Prints "3: 'f'"
// Prints "4: 't'"

 

예제

let arr = [1, 2, 3, 4]

for (index, value) in arr.enumerated() {
    print(index, value)
    //0 1
    //1 2
    //2 3
    //3 4
}

오오 진짜 enumerated() 사용했으면 쉽게 문자열의 index를 구해서 대문자로 바꾸기 할 수 있었을 듯?

그리고 enumerate 할 경우, element, offset 사용이 가능한데

let arr = [3, 2, 12, 32]

let index = arr.enumerated()
    .filter { $0.element == 12 }
    .map { $0.offset }
    .first

element는 요소를 찾아주고, offset은 index를 찾아주는 것 같다.

 

그리고 위 코드는 joined를 사용해서 간단하게 components 해서 분리한 문자열을 합쳤다 ! 굳👍🏻

 


 

 

//43.삼총사
import Foundation
func solution(_ number:[Int]) -> Int {
    var result:Int = 0
    
    for i in 0..<number.count {
        for j in i+1..<number.count {
            for k in j+1..<number.count {
                if number[i] + number[j] + number[k] == 0 {
                    result += 1
                }
            }
        }
    }
    return result
}

아 이것도 경우의 수를 구해주는 함수가 있나 찾아보다가..

그런 건 없는 것 같아서 그냥 풀었다...

 

알고리즘 난이도가 올라갔는데 하루에 2개씩 하려니까 머리가 아프다...

사전캠프 때 못한 거 다 풀어서 따라가려고 하는데 ㅠㅠ 어렵네..

 


 

Counter 예제

 

레이아웃 요구사항

1. UILabel이 가운데 위치

Label을 추가해서 AutoLayout을 설정해 준다.

- Horizontally, Vertically 둘 다 체크해서 0으로 설정해 주고, Add 2 Constraints 해주면 가운데 위치하게 된다.

- 그럼 아이패드 모양이나 다른 사이즈의 틀로 바꿔도 Label은 그대로 가운데 위치해 있는 것을 확인할 수 있음.

 

2. UILabel을 기준으로 상단에는 감소버튼, 아래에는 증가버튼 위치

3. UILabel과 UIButton 사이의 간격은 16px로 설정

양 옆으로는 중앙을 맞춰주기 위해서 Horizontally만 0으로 맞춰주고,

UILabel과 16px 차이가 나게 맞춰주기 위해서 Constraints를 사용해서 위에 Label과의 거리(영역)?을 16으로 맞춰준다.

위에 버튼도 동일한 방식으로 맞춰주면 완성

 

4. AutoLayout 사용

AutoLayout을 사용했고, 이제 작동하도록 만들어보자

 

로직 요구사항

1. count의 시작은 0

2. 감소버튼을 눌렀을 때, -1씩 감소시켜 UILabel에 표시

3. 증가버튼을 눌렀을 때, +1씩 증가시켜 UILabel에 표시

Label은 IBOutlet으로 Button은 IBAction으로 연결해 주었다.

counter 예제 결과화면

 


 

이제 TodoList 과제를 시도해 보자!

 

Lv1. Todo List 화면 만들기 (TodoListViewController) 키워드 : UIButton, UITableView

 

일단 추가 버튼이랑 UITableView는 추가했는데..

내일 정리해야겠다ㅏ..

갈 길이 멀다.. 내일의 나.. 화이팅..

'TIL' 카테고리의 다른 글

20일차 TIL  (3) 2024.03.25
19일차 TIL  (3) 2024.03.22
17일차 TIL  (1) 2024.03.20
16일차 TIL  (2) 2024.03.19
15일차 TIL  (4) 2024.03.18