TIL

20일차 TIL

h_luz 2024. 3. 25. 22:04

 

Swift 알고리즘 및 언어공부

 

44. 최소직사각형

 

1. 왼쪽이 더 크게 정렬

2. 가장 큰 가로, 세로 선택

3. 선택한 가로, 세로 값 곱해서 리턴

 

import Foundation

func solution(_ sizes:[[Int]]) -> Int {
    var sortArr = sizes.map{$0.sorted(by:>)}

    var wArr = sortArr.map{$0.max()!}
    var hArr = sortArr.map{$0.min()!}

    return wArr.max()! * hArr.max()!
}

 

2차원 배열

: 배열 안에 값으로 배열이 있다.

 

2차원 배열 예시

->  sizes:[[Int]] = [[60,50],[30,70],[60,30],[80,40]]  // 배열 안에 배열이 존재하는 형태

->  sizes[0] = [60,50]  // index 0의 값은 배열로 나온다.

->  sizes[0][1] = 50  // 배열 속 배열의 값을 이런 식으로 추출할 수 있음

->  sizes[2][1] = 30

 


 

45. 시저암호

 

1. 알파벳 값 대문자 소문자 분류해서 저장

2. 알파벳 위치 찾기(대소문자 분리) -> contains(), isLowercase, isUppercase

3. 알파벳 위치 구해서 + n 만큼 이동 -> firstIndex()

4. 결과 String에 이동한 값 추가 (띄어쓰기 유의)

* z 넘어가면 위치값에 26 빼주기

 

func solution(_ s:String, _ n:Int) -> String {
    let Balphabet:[Character] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
    let Salphabet:[Character] = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    var num:Int = 0
    var result:String = ""
    var sArr = Array(s)

    for i in sArr {
        if Salphabet.contains(i) { //소문자
            num = Salphabet.firstIndex(of: i)! + n
            if num > 25 { num = num - 26 } // z 위치 넘었을 때
            result.append(Salphabet[num])
        } else if Balphabet.contains(i) { //대문자
            num = Balphabet.firstIndex(of: i)! + n
            if num > 25 { num = num - 26 }
            result.append(Balphabet[num])
        } else { //문자열에 띄어쓰기가 있을 경우
            result.append(i)
        }
    }
    return result
}

 

contains()

: 시퀀스에 지정된 요소가 포함되어 있는지 여부를 나타내는 부울 값을 반환

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
print(cast.contains("Marlon")) // Prints "true"
print(cast.contains("James")) // Prints "false"

이 방법으로 대문자인지 소문자인지 구분할 수 있다.

 

isLowercase, isUppercase

: 이 문자가 소문자로 간주되는지, 대문자로 간주되는지, 여부를 나타내는 부울 값

if i.isLowercase {}  //소문자일 경우
if i.isUppercase {}  //대문자일 경우

위에 시저 암호 예제에 contains() 대신에 isLowercase와 isUppercase를 썼다면, 이렇게 사용되었을 것이다.

 

 

firstIndex(of:)

: 컬렉션(배열 같은 것들)에서 지정된 값이 나타나는 인덱스를 반환

var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.firstIndex(of: "Maxime") { // 즉, i 는 3이다.
    students[i] = "Max"
}
print(students) // Prints "["Ben", "Ivy", "Jordell", "Max"]"

 


 

Todo List 과제

 

1. 화면구성

 

처음부터 이 오류 때문에 애를 먹었다...

The myTableViewCell outlet from the ViewController to the myTableViewCell is invalid. Outlets cannot be connected to repeating content.

 

- 이 오류는 custom class 연결하는 방법 헤매다가 생겼던 것 같음.

custom class 연결을 잘 못해서 label 이랑 switch가 연결이 안 돼서 이것저것 해보고, 여기저기에 연결해보다 보니까 나중에 custom class 연동해서 연결했을 때 오류가 생겼던 거 같음

여튼 myTableViewCell을 storyboard에 셀에 custom class로 잘 연결하고, myTableViewCell에 label이랑 switch 연결하니까 오류가 안 뜨고, 잘 되었음. 

 

myTableViewCell 파일을 만들어서 cell의 커스텀 클래스를 myTableViewCell로 지정해 주고,

안에 라벨과 스위치 (요소들)를 myTableViewCell에 연결해 준다.

 

저번 TIL에서 올린 사이트 보고 따라 했는데

다른 에러는 안 나는데 하얀 화면 뜨고, 안 나오다가 갑자기 app delegate 코드 막 나오고 빨간색 뜨면서 에러가 났다.

 

Thread 1: "unable to dequeue a cell with identifier myCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard"

 

이런 오류가 나서 뭐지.. 하고 검색해 봤는데 친절하게 설명이 나와있었다. (참고 사이트)

저 밑에 캡쳐본에 보이는 Identifier에 myCell이라고 설정을 안 해줘서 오류가 났는데

 

 

코드를 보면 이렇다

 

 

cell 지정해 주는 부분에 withIdentifier: "myCell"이라고 적어놓고, 정작 Identifier에 아무것도 안 적어줘서 생긴 오류였다 !

 

그래서 다시 실행해 보면

전에는 하얀 화면만 나왔는데, 이젠 잘 나오는 것을 확인할 수 있다.

 

느낀 점 : custom class 연결해 줄 때 이상한 거 연결하지 않게 주의하고, identifier 잘 확인하자..

 


 

이제 추가하기 버튼을 만들어보자

버튼을 storyboard에 생성하고, 연결해 준 뒤에 setTitle을 사용해서 버튼에 들어가는 글자를 바꿨다.

 

그런데 또 오류가 났다..

 

Thread 1: "[<Assignment_3.ViewController 0x1042095a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key myButton."

 

코드엔 이상이 없는 것 같은 데 오류가 나서 검색해 보니 어떤 오류인지 알 수 있었다.

여기 사이트에 나랑 같은 오류를 겪고 있는 사람이 있었다.. !

 

addButton을 하기 전에 이름을 myButton으로 했다가 바꿨었는데 그게 오류를 불러왔던 것 같다.

버튼을 우클릭해보면 Referencing Outlets에 myButton이 남아있는 것을 알 수 있다..

그래서 쓸데없이 연결되어있는 myButton을 지워주면 오류가 사라진다.

정상적으로 추가하기 버튼까지 만들어진 것을 알 수 있다.

 

휴 간단한 것들도 오류가 나기 쉽구나...

오류 찾기 도사가 돼버릴지도..

 

내일은 추가하기 버튼의 기능을 완성해 보자!

 

'TIL' 카테고리의 다른 글

22일차 TIL  (2) 2024.03.27
21일차 TIL  (2) 2024.03.26
19일차 TIL  (3) 2024.03.22
18일차 TIL  (2) 2024.03.21
17일차 TIL  (1) 2024.03.20