TIL

35일차 TIL

h_luz 2024. 4. 16. 22:31
Swift 알고리즘 및 언어공부

 

아니 문제가 왜 이렇게 길어.. 깜짝 놀랐네..

 

입출력 예시를 보면 더 이해하기 쉽다 !

 

1. section에 첫 번째 수부터 m만큼 이동 (색칠)

2. cnt에 1 추가

3. 이동한 값이랑 section 두 번째 수랑 비교해서 이미 색칠되었는지 아닌지 확인

4. 색칠되지 않았다면 cnt에 1 추가하는 거 반복

 

배열로 m 개씩 반복하면서 contain함수로 포함하는지 안 하는지 확인해서 어쩌구 생각했다가, 칠해야 할 부분이랑 아닌 부분 true, false로 지정해서 색칠해 주기.. 이런 거 생각해 봤는데,, 너무 꼬이는 것 같아서 그냥 다 지우고ㅜ 다시 생각해 보니

그냥 section 에서부터 m만큼 색칠해 주면 되잖아ㅏ..? 겹치면 그냥 넘어가고, 색칠 안 해준 section 만나면 색칠해 주자.. 해서 시도..

이렇게 하니까 답이 잘 나오는 것을 볼 수 있음 ! 이렇게 보니까 간단하고,, 쉬워 보이네,,,, 흑,,

ㅎ ㅏ 알고리즘 정말.. 어렵다!!!

 

import Foundation

func solution(_ n:Int, _ m:Int, _ section:[Int]) -> Int {
    var paint = 0
    var cnt = 0

    for i in section {
        if paint < i {
            cnt += 1
            paint = i + m - 1
        }
    }
    return cnt
}

함수로 보면 이렇게 볼 수 있다!

 

//다른사람의풀이
import Foundation

func solution(_ n:Int, _ m:Int, _ section:[Int]) -> Int {
    var notPainted = section
    var end = 0
    var cnt = 0

    while !notPainted.isEmpty {
        var area = notPainted.removeFirst()

        if end >= area {
            continue
        } else {
            end = area + m - 1 // 시작 지점 + 롤러의 길이 - 1
            cnt += 1
        }
    }

    return cnt
}

옹  나도 section 배열 색칠된 거 하나씩 삭제하면서 section이 비었을 때 종료하도록 하는 코드 만들고 싶었는데, 이런 식으로 만드셨구나.. notPainted.isEmpty 앞에 느낌표로 배열이 있는 동안 while문 돌리는 코드가 인상적이었음 굳굳..

 

세상 사람들 정말 똑똒하네.. 어딘가에 true false로 저 문제를 풀어낸 코드도 있겠지.. ?

 


 

iOS 숙련 개인 과제 : 위시리스트 앱 만들기
[스파르타 코딩클럽]

 

저번에 했던 DispathQueue에서 .main과 .global은 무슨 차이일까.. 해서 찾아봤다.

우선 비동기는여러 개의 Thread로 뿌려서 작업을 진행하는데,

DispatchQueue.main.asyn { : 여기서 main은 main thread를 의미한다. ( UI적 코드는 메인에서만 수행 )

DispatchQueue.global() : sub thread를 의미

main thread에서 동기적으로 처리되는 작업이 추가되면 그 작업이 끝나는 동안 UI가 멈춰버린다.

이를 해결하기 위한 서브 스레드가 DispatchQueue.global()인 것 같음!

 

간단하게 정리하자면 이렇지만 여기 사이트에 굉장히 자세히 나와있어서 굳이었다!

https://dev-workplace.tistory.com/10

 

Swift DispatchQueue 기본 원리

제가 이해한 내용을 이해하기 쉽게 정리합니다. 혼잣말하는 느낌으로 작성해서 반말로 작성했습니다 ! DispatchQueue를 사용해야하는 이유는 도대체 뭘까?? -> 비동기적으로 처리해야할 데이터(API

dev-workplace.tistory.com

 

그럼 본격적으로 이제 위시리스트에 담기 부분을 공부해 보자

viewContext

: 메인 큐의 관리되는 개체 콘텍스트 (즉, coreData의 내용을 관리해 주는 프로퍼티)

 

이 함수는 위시리스트 담기를 누르면 테이블 뷰에 추가되도록 설정해야 한다

 

추가해 줬으니 이제 테이블뷰에 표시해 보자

조건에 따라 (버튼 클릭 시 이동) 스토리뷰를 설정해 주려면 코드로 설정해야 하는데, 33일 차 TIL에 보면 코드로 화면을 전환하는 방법이 있는데, 응용해서 해보자

 

그리고 그전에 만들어놓은 테이블뷰를 사용하기 위해서 스토리보드에 생성한 ViewController를 WishListViewController.swift와 연결하고, 스토리보드 ID 설정해 주기

 

그리고 버튼 클릭 시 화면을 전환하는 코드

 

음 이건 다른 이야기긴 하지만,, guard let 문 계속 보다 보니까 전에 면접 볼 때 튜터님이 if let과 guard let의 차이점 알려주시면서 guard let은 else return까지 생각하면 이해하기 좋다 하셨던 거 생각나네... 여기 guard else 보면 죄다 else { return } 이어서.. 하핫 이렇게 코드로 보니까 더 머리에 잘 들어오는 것 같구먼...

 

자 그럼 이제 WishListViewController 코드를 보자면

우선 여기서는 CoreData에 저장된 현재 데이터를 가져와서 쓰는 것이기 때문에 저장소에 접근할 수 있는 코드가 필요하다

ViewController와 같이 Core Data, AppDelegate에 설정한 저장소에 접근하기 위한 코드 작성

 

위시 리스트에 담은 상품들의 데이터가 담겨있는 CoreData 상품 데이터를 저장! -> 이 데이터를 테이블 뷰에 출력할 것!

 

내일 셀 생성하고, 어플을 좀 다듬어야겠다! ㆅㆅ 

굳 👍🏻