TIL

34일차 TIL

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

 

58. 소수 만들기

 

import Foundation

func solution(_ nums:[Int]) -> Int {

    var answer = 0
    var result = 0

    for a in 0..<nums.count {
        for b in a+1..<nums.count {
            for c in b+1..<nums.count {
                result = nums[a] + nums[b] + nums[c]
                if isPrime(num: result) {
                    answer += 1
                }
            }
        }
    }
    return answer
}

func isPrime(num: Int) -> Bool {
    if(num<4) {
        return num == 1 ? false : true
    }
    for i in 2...Int(sqrt(Double(num))) {
        if(num % i == 0) { return false }
    }
    return true
}

소수 구하는 공식이나 함수가 있을까 해서 찾아봤는데, 다들 함수로 만들어서 사용하길래 가져왔다!

소수만 구하면 쉬운 문제였던 것 같음!

 

우선 1,2,3은 무조건 소수이기 때문에 4보다 작은 수라면 소수.

그리고 num % i 즉, 2 이상인 수로 나눴을 때 0이면 소수가 아니기 때문에 false를 리턴하고, 0이 아닐 경우 소수로 쳐서 true를 리턴.

sqrt는 전에 공부했던 제곱근 함수이다. 즉, 소수를 구하기 위해서는 1을 제외한 √num까지의 수 중에 약수가 있는지 확인하는 것

 

//다른사람의풀이
import Foundation

func solution(_ nums:[Int]) -> Int {
    var result = [Int]()
    for i in 0..<nums.count {
        for j in i+1..<nums.count {
            for k in j+1..<nums.count {
                result.append(nums[i]+nums[j]+nums[k])
            }
        }
    }
    return result.filter { i in
        for j in 2..<i {
            if i % j == 0 {
                return false
            }
        }
        return true
    }.count
}

이건 다른 사람의 풀이인데, 함수로 구하지 않고,

간단하게 '확인하려는 숫자를 2부터 차례차례 나눠서 나머지가 0이 나오지 않는 숫자' 들을 filter 함수로 골라내서 .count로 개수를 구하는 방식이었다. 조금 더 생각해 보면 이런 식으로도 풀 수 있구나 싶었다.. 난 언제쯤 고차함수를 적절하게 사용할 수 있게 될까.. ㅜ

 


 

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

 

 

JSON(JavaScript Object Notation) : 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷

 

데이터 모델링

- 상품 데이들을 담아줄 원격 API에서 받아올 데이터 모델링

Model폴더와 Product.swift 파일 만들어주기

Decodable로 데이터를 가져오기 위한 모델 객체 만들어주기

 

- Core Data 모델링

: 위에 생성한 데이터들을 사용하기 위해서(위시리스트 담기 시 보여주기) Core Data도 설정해 줄 필요가 있음

 


 

AppDelegate에 설정한 persistentContainer에 접근

 

didSet

- Observer

- 값이 변경된 후 값이 호출된다.

- 값이 변경될 때 따라서 자동으로 변경되어야 하는 값에 사용된다.

 

DispatchQueue

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

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

 

async

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

 

Decoding

: JSON 형태의 Data를 struct, class, enum 등의 인스턴스에 자동으로 파싱

( 파싱, Parsing :  XML 형식의 마크업으로 전달된 데이터는 형식에 맞게 분석하는 과정이 필요하다 과정을 파싱이라고 한다 )

 

fetchProduct함수는 viewDidLoad(처음 실행했을 때)와 tappedNextButton(다음 상품 보기 버튼)을 눌렀을 때 실행되도록 설정

 

* 앗 API에서 받아오는 데이터 모델이랑 Entity랑 이름이 같아서 에러 났다! ㅋㅋㅋ... (바보..?) 그래서 Model 파일에 있는 구조체를 Product -> RemoteProduct 변경! 당연히 코드에 있는 Product들도 바꿔야 함.. 헿

 

엥 근데 실행해 보면 아무것도 데이터 연결이 안 되어있음

 

* 링크 적을 때 오타 났다!! 수정하려면 ->  if let url = URL(string: "https://dummyjson.com/product/\(productID)") {

 

근데 수정해도 안 돼서 왜지.. 하고 살펴보다가

 

여기 json 파일에는 title이라고 적혀있는데 구조체에 name이라고 적어놓음.. (바보...?)

*name으로 쓰인 부분 title로 바꾸니까 정상적으로 작동함! (RemoteProduct파일이랑 ViewController파일 전부 수정해야 함! ㅎㅎ)

 

여하튼 수정해 주면 잘 나온다! 굳