TIL

38일차 TIL

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

 

네 가지 발음을 조합한 발음과 네 가지 발음만 가능하다고 해서

1 글자 하나씩 append 해서 비교하고, 같으면 배열 비우기

2 배열이 비어있다면 result에 1을 더하고, 배열이 비어있지 않으면 발음할 수 없는 것이기 때문에 패스

3. 남아있는 배열 비워주고 반복

 

2가 나와야 하는 데 왜 3이 나오지..?! 해서 코드를 살펴보니.. "yeye"와 같이 연속 같은 발음은 불가능한데 이 코드대로 하면 "yeye"까지 포함돼서 3이 나오던 것..ㅜ '연속 같은 발음은 불가능' ,,, 왜 못 봤지..

 

여하튼 '연속 같은 발음을 불가능'하게 하려면 이렇게 한 글자씩 append 해주는 걸로는 안될 것 같고,, 새로운 string 변수를 만들어서 pronun4랑 같을 때마다 배열에 저장하는 방법은 어떨까..

그리고 배열에 마지막에 저장된 값이랑 달라야 한다는 조건 넣기

for 문으로 pronun4 하나하나 확인해 주는 것보다 contains가 더 효율적? 일 것 같아서 contains 사용해 줌!

배열에 마지막에 추가한 값이랑 확인해 줄 때는 배열 .last 해줬다

 

배열 str이랑 result랑 같이 선언해줬다가 또 결과 값 이상하게 나와서 애먹음..

배열은 반복되는 발음이 불가능하도록 한 단어?에서 일어나는 일이기 때문에 계속 초기화해줘야 함! str도 그렇고,,

어.. 그럼 str도 그냥 str = ""  안 하고, 배열 밑에 선언하면 될 듯 ? 

오 굳,,

 

import Foundation

func solution(_ babbling:[String]) -> Int {
    var result:Int = 0
    var pronun4 = ["aya", "ye", "woo", "ma"]

    for i in babbling {
        var babblingC = i
        var arrS:[String] = []
        var str:String = ""
        for j in babblingC {
            str = str + String(j)
            if pronun4.contains(str) && arrS.last != str {
                arrS.append(str)
                str = ""
            }
        }
        if str.isEmpty { result += 1 }
    }
    return result
}
solution(["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]) // 2 출력

마지막 결과 코드 ! 정리하자면

1 한 글자씩 str에 담으면서 비교

    발음이 같은 지(contains) && 반복되는 발음 불가능 (last로 마지막에 배열에 추가한 string과 추가할 string이 같지 않을 때)

2 반복되는 발음 불가능하도록 배열에서 마지막에 추가된 값과 비교할 수 있게 append

3 str 비우기

4. str에 값이 없다면 발음할 수 있는 것이니까 result에 1 추가

5. 다음 값을 비교할 수 있도록 배열과 str을 비워주는 작업이 필요하다

 

뭔가 굉장히.. 어려웠다..

뭐지ㅜ 문제가 짧고, 간단해 보였는데 ,, 하핫.. 그래도 어떻게든 풀어서 다행..ㅜ

차라리 다 틀려서 처음부터 다시 푸는 게 낫지,, 하나 틀어져서 고쳐야 하는 게 더 어려운 것 같다...

 

엥?! 아니 당연히 괜찮을 줄 알았는데 갑자기 테스트 2 문제?가 시간초과가 떠서,, chatGPT한테 물어봄..

  1. 검색 최적화: pronun4.contains(str)에서 contains 메서드는 선형 검색을 수행하므로 문자열 검색에 많은 시간이 소요될 수 있습니다. 대신 세트(Set)를 사용하여 더 빠르게 검색할 수 있습니다.
//찐막코드,,
import Foundation

func solution(_ babbling:[String]) -> Int {
    var result:Int = 0
    let pronunSet: Set<String> = ["aya", "ye", "woo", "ma"]

    for i in babbling {
        var babblingC = i
        var arrS:[String] = []
        var str:String = ""
        for j in babblingC {
            str = str + String(j)
            if pronunSet.contains(str) && arrS.last != str {
                arrS.append(str)
                str = ""
            }
        }
        if str.isEmpty { result += 1 }
    }
    return result
}

Set 사용하라해서 하긴 했는데, 이거 하나 바꿨다고 시간초과 안 되고, 잘 실행되는 게 신기해서 어떤 원리인지 궁금했다..

그래서 그냥 배열과 Set 비교해서 정리!

 

Set(세트)

: 해시 테이블(hash table)을 사용하여 원소를 저장 및 검색 (매우 빠른 검색 속도)

    - 해시 테이블(hash table)이란? 

       ㄴ key-value로 값 저장, 데이터가 순서를 지키지 않고 저장됨

    - Set는 해시 함수를 사용하여 각 원소를 고유한 해시 값으로 변환하고, 이 해시 값으로 원소의 저장 위치를 결정한다.

       ㄴ 세트에서 원소를 찾을 때는 해시 값을 기반으로 빠르게 검색 가능

       ㄴ 세트 크기와 상관없이 원소를 찾을 수 있음

       ㄴ 문자열의 포함 여부를 효율적으로 확인할 수 있음

 

일반 배열, 리스트

: 선형구조로 이루어져 있다. ( 데이터가 순서대로 저장됨 )

    - 원소를 찾기 위해서 전체 원소를 순차적으로 탐색

        ㄴ 원소 개수에 비례해서 검색시간 증가


모의 면접 질문 공부
(스파르타 코딩 클럽)

 

1.CoreData의 각 Entity, Attribute, Relationship의 역할을 아는 대로 설명해 주세요.

    Entity는 데이터 베이스의 테이블이며, 데이터 모델 내에서 객체의 유형을 정의하고 객체의 속성을 나타냅니다.

    Attribute는 Entity를 구성하는 프로퍼티들이고,

    Relationship은 두 개 이상의 Entity. 서로 간의 관계를 나타냅니다.

 

2. 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체가 무엇인지 아는 대로 설명해 주세요.

    앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체는 UIView입니다.

    사용자에게 보일 UILabel, UIButton과 같은 화면 구성요소들을 모두 UIView라고 합니다.

 

3. URLSession에 대해서 아는 대로 설명해 주세요.

    앱과 서버 간 데이터를 주고받는 API를 제공하는 클래스입니다.

    URLSession은 자체적으로 비동기적으로 동작하기 때문에 따로 비동기 처리를 할 필요가 없습니다.

 

4. 앱의 콘텐츠나 데이터 자체를 내부 저장/보관하는 특별한 객체로는 무엇이 있는지 아는 대로 설명해 주세요.

    앱 내부 저장소에 키-값의 쌍으로 저장하는 인터페이스인 UserDefaults(유저디폴트),

    객체 데이터를 관리하기 위한 프레임워크 Core Data(코어 데이터),

    모바일에 최적화된 데이터베이스 라이브러리 Realm(렘),

    전체 데이터베이스를 디스크 파일 1개에 저장하고 사용하는 SQLite(에스큐엘라이트)가 있습니다.

 

5. 이번 챕터에서 학습을 하며 알게 된 기술, 지식을 정리해 보세요.

    - DispatchQueue 

        앱의 메인 스레드 또는 백그라운드 스레드에서 순차적 또는 동시적으로 작업 실행을 관리하는 개체입니다

        FIFO 대기열로 애플리케이션에서 블록 개체 형태로 작업을 제출할 수 있습니다.

    - async

        async 비동기 처리입니다. 작업이 끝나는 것을 기다리지 않고 작업을 수행하도록 일을 처리합니다. (백그라운드에서 작업)


 

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

 

추가기능 구현 (당겨서 새로고침)

어제 하려다가 못한.. 추가기능을 레벨 5를 구현해보려고 한다..!

main 스토리보드도 다시 스토리보드 형태로 돌려서 AutoLayout 설정도 해줘야 함..ㅜㅜ

 

UIRefreshControl

: 스크롤 뷰 내용의 새로 고침을 시작할 수 있는 표준 컨트롤

 

1. UIRefreshControl 객체를 생성하고 초기화

private lazy var refreshControl: UIRefreshControl = {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged)
    return refreshControl
}()
  • refreshControl : 새로고침할 때 사용할 객체 
  • lazy var로 refreshControl 선언하여 UIRefreshControl 객체를 초기화하고 설정
  • addTarget(_:action:for:) : 사용자의 새로고침 액션 감지, refreshData(_:) 호출 ( -> 원하는 작업 수행 )

 

2. setupRefreshControl 함수로 화면에 refreshControl 추가

private func setupRefreshControl() {
    let scrollView = UIScrollView()
    scrollView.refreshControl = refreshControl
}

 

  • setupRefreshControl()에서 refreshControl을 스크롤 뷰에 추가
  • viewDidLoad()에 setupRefreshControl() 추가해 주기!

 

3. 액션처리해 주기 ( refreshData()에 당겨서 새로고침 시 실행될 액션 추가 )

@objc private func refreshData(_ sender: Any) {
    fetchProduct()
}
  • 당겨서 새로고침 시 제품이 다른 제품으로 변경되어야 하므로 fetchProduct() 함수를 호출하여 새로운 상품 화면에 표시

 

4. 새로운 상품 가져와서 화면 업데이트

//currentProduct가 set되면 각각에 적절한 값 지정
    var currentProduct : RemoteProduct? = nil {
        didSet {
            guard let currentProduct = self.currentProduct else { return }
            
            DispatchQueue.main.async {
                self.imageView.image = nil
                self.nameLabel.text = currentProduct.title
                self.priceLabel.text = "\(currentProduct.price)$"
                self.descriptionLabel.text = currentProduct.description
                self.refreshControl.endRefreshing() // 새로고침 종료
            }
            
            DispatchQueue.global().async { [weak self] in
                if let data = try? Data(contentsOf: currentProduct.thumbnail), let image = UIImage(data: data) {
                    DispatchQueue.main.async {self?.imageView.image = image}
                }
            }
        }
    }
  • 기존에 있던 currentProduct에 self.refreshControl.endRefreshing()을 호출하여 새로고침 애니메이션을 멈춤 ( 당겨서 새로고침을 했을 경우, 일시적으로 화면 상단에 애니메이션을 표시하여 데이터를 가져오는 중임을 나타낸다. 화면 업데이트 후에는 endRefreshing을 호출하여 종료해주어야 함 -> 데이터가 업데이트되고 완료되었다는 시각적 피드백 제공해야 함 )

이렇게 이렇게 했는데 생각해 보니 scrollView가 스토리보드에 없어서 view를 scrollView로 교체함

identity inspector에 UIView로 되어있는 class를 UIScrollView로 바꿔주면 간단!

 

당겨서 새로고침까지 잘 된다!

 

근데 오토레이아웃 설정해 주면 당기는 느낌이 안 나던데 왜징.....

내일 생각해 보자 ~ ㅋㅋㅋㅋㅋ

'TIL' 카테고리의 다른 글

41일차 TIL  (1) 2024.04.24
40일차 TIL  (0) 2024.04.23
37일차 TIL  (3) 2024.04.18
36일차 TIL  (6) 2024.04.17
35일차 TIL  (8) 2024.04.16