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을 지워주면 오류가 사라진다.
정상적으로 추가하기 버튼까지 만들어진 것을 알 수 있다.
휴 간단한 것들도 오류가 나기 쉽구나...
오류 찾기 도사가 돼버릴지도..
내일은 추가하기 버튼의 기능을 완성해 보자!