TIL

30일차 TIL

h_luz 2024. 4. 8. 21:18

 

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 도 해줘서 연결!

paymentTableViewCell.xib 파일

 

그리고 폰트 설정을 해줄 때는 

 

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

 

GitHub - sam98528/5SkinRabbins: 5SkinRanbins

5SkinRanbins. Contribute to sam98528/5SkinRabbins development by creating an account on GitHub.

github.com

 

프로젝트이름은 5Skin Robbins이고, 배스킨라빈스 아이스크림 키오스크이다.

WireFrame

 

실제화면

 

좋은 경험이었따 🙌

 

피드백은

- 반복되는 코드가 많다

    ㄴ 상속이나 프로토콜을 사용하여 통일

- viewDidLoad 알아보기 쉽게 정리

- AutoLayout 공부