30일차 TIL
Swift 알고리즘 및 언어공부
그동안 팀프로젝트를 진행하느라 하지 못했던 알고리즘을 계속 풀어보려고 한다!
항상 아침에 일어나면 막 급하게 노트북 켜서 과제 시작했는데,, 프로젝트를 완료했다는 게 살짝 실감이 난다.
풀어보면 굉장히 간단한데, 그 푸는 방법에 도달하기까지 엄청나게 생각해야 하는 문제였다.. 아닌가 나만.. 바보인가..?!
처음에는 각 달에서 시작하는 요일을 구해서 일수만큼 또 더해서 막 이런 식으로 생각하니까 아니.. 어떻게 풀지... 이렇게 하는 거 아닌 거 같은데라고 본능들이 외치기 시작함.. 그래서 힌트를 얻기 위해 검색 찬스를 썼는데,
입력받은 총일수에 나누기 7을 해서 나머지 값으로 요일을 구하면 된다고,,,ㅠ이런 똑똑한 방법이...😵💫
func solution(_ a:Int, _ b:Int) -> String {
let dayW:[String] = ["SUN","MON","TUE","WED","THU","FRI","SAT"]
let endOfMonth:[Int] = [31,29,31,30,31,30,31,31,30,31,30,31]
var cnt:Int = 0
var result:String = ""
for i in 0..<a-1 {
cnt += endOfMonth[i]
}
result = dayW[((cnt + b + 4) % 7)]
return result
}
결과적으로는 이런 코드가 나왔다
처음에는 endOfMonth를 안 해줬었는데, if문으로 하자니 윤년이기도 하고, 일 수가 규칙적이지 않아서,, 배열로 만들었다. 굳
여하튼 그래서 배열로 정리해서 cnt 값에 총일수를 구하기 위해 각 월에 일 수를 더해주고,
입력받은 일수까지 더해주면 총일수를 구할 수 있게 된다! (cnt + b)
거기에 요일을 구하는 것이기 때문에 배열의 시작인 인덱스 값을 더한다.
( 주의해야 할 점은 금요일을 1부터 세서 더하기 위해서 목요일을 0으로 해서 시작해야 한다는 것! 그래서 목요일에 index값인 4를 더한다. )
총일수에 나누기 7을한 나머지 값에 배열에 위치한 날짜가 그날에 요일에 됨!
하.. 알고리즘 너무 어려워서 자괴감 든다...
func solution(_ a:Int, _ b:Int) -> String {
let w = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]
let monthDay = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
let totalDay = monthDay[0..<a-1].reduce(0, +) + b
return w[totalDay % 7]
}
이건 다른 사람의 풀이인데,
reduce 함수를 쓰셨음!
오늘은 프로젝트하면서 배운 것들을 좀 더 자세하게 정리해보려고 한다!
우선 가볍게 셀 요소 설정 (폰트 사이즈나 폰트 등등)
* TableView를 기준으로
cell 안에 들어있는 요소들의 폰트 설정은 TableView 함수에 cellForRowAt에서 설정할 수 있음.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 이곳에서 셀 속 요소들의 폰트를 설정할 수 있다.
}
let cell = tableView.dequeueReusableCell(withIdentifier: "paymentCell", for: indexPath) as! PaymentTableViewCell
우선 cell 변수에 다른 파일에 만들어놓은 셀의 정보를 가져온다. 여기서 withIdentifier이 중요한데,
셀 identifier을 잘 설정해 줘야 연결할 수 있다. 그리고 셀 파일을 따로 만들었다면 as! PaymentTableViewCell 도 해줘서 연결!
그리고 폰트 설정을 해줄 때는
1. 폰트 사이즈 설정 ( *payNameLabel은 요소를 코드에 연결해 줬을 때 설정한 이름 )
cell.payNameLabel.font = UIFont.systemFont(ofSize: 15)
ofSize에 값을 넣으면 된다
2. bold 값 넣어서 글씨 두껍게 만들기
cell.payNameLabel.font = UIFont.boldSystemFont(ofSize:15)
3. 버튼 글씨에 폰트 사이즈 설정하기
cell.plusButton.titleLabel?.font = UIFont.systemFont(ofSize: 15)
4. 버튼에 색상 넣기
cell.plusButton.tintColor = .black
5. numberOfLines
: 레이블의 텍스트를 경계 사각형에 맞추기 위해 사용할 최대 줄 수를 제어합니다. (기본값은 1)
즉, 설정을 따로 하지 않으면 최대 줄 수는 한 줄로 설정
cell.payDetailLabel.numberOfLines = 0
numberOfLines를 0으로 설정해 주면 경계 사각형에 맞춰서 줄 수에 상관없이 출력한다.
6. 셀에서 코드로 AutoLayout 설정
오토레이아웃을 코드로 작성하는 방법은 3가지가 있는데,
Anchor, Initializer, VisualFormat 이 있다.
그중에서 Anchor을 사용했다.
cell.payNameLabel.topAnchor.constraint(equalTo: cell.topAnchor, constant: 30).isActive = true
// payNameLabel 상단 여백 설정
이런 식으로 사용할 수 있음. 여기서 Anchor을 다양하게 사용할 수 있는데,
topAnchor
: 뷰 프레임의 위쪽 가장자리를 나타내는 레이아웃 앵커
leadingAnchor
: 뷰 프레임의 앞쪽 가장자리를 나타내는 레이아웃 앵커
centerXAnchor
: 뷰 프레임의 수평 중심을 나타내는 레이아웃 앵커
centerYAnchor
: 뷰 프레임의 수직 중심을 나타내는 레이아웃 앵커
아 그리고 이건 완성한 키오스크 어플
https://github.com/sam98528/5SkinRabbins
프로젝트이름은 5Skin Robbins이고, 배스킨라빈스 아이스크림 키오스크이다.
좋은 경험이었따 🙌
피드백은
- 반복되는 코드가 많다
ㄴ 상속이나 프로토콜을 사용하여 통일
- viewDidLoad 알아보기 쉽게 정리
- AutoLayout 공부