TIL

36일차 TIL

h_luz 2024. 4. 17. 23:07
Swift 알고리즘 및 언어공부

 

60. 기사단원의 무기

또 문제가 길구먼,,,

 

1번 기사부터 number번 기사의 무기를 사는데, 필요한 철의 무게를 return 해야 한다.

각 기사는 약수의 개수를 공격력으로 가지는 무기를 구매해야 한다.

공격력 제한 수치 limit의 값을 넘을 경우 power로 공격력을 제한한다.

공격력 1당 1kg에 철이 필요함

 

1. 1번부터 number번의 약수의 개수를 구해 배열에 append

2. 배열을 다 더하는데 if문으로 limit이랑 비교해서 계산

 

뭔가 고차함수나 더 코드 줄일 수 있을 것 같은데,,라고 생각했는데 , 시간초과 오류가 나버렸다! 하하..

 

for i in arr 부분 삼항연산자로 바꿔서 코드 줄여줬는데,, 그래도 시간초과..

 

chatGPT한테 물어보니까,,

number가 큰 경우에는 연산이 매우 느려질 수 있습니다.

현재 코드에서는 1부터 까지의 모든 수에 대해 을 나누어서 나머지가 인 수를 찾는데, 이는 비효율적입니다. 대신, 의 약수를 찾는 과정에서 의 제곱근까지만 나눗셈을 수행하면 충분합니다. 이는 의 약수라면, 의 약수임을 의미합니다.

 

약수를 구할 때 number이 큰 경우에 약수를 구하는데 비효율적이라는 뜻..

n의 제곱근까지만 나눗셈을 하면 더 효율적으로 약수를 구할 수 있다. (전에도 비슷한 일이 있었던 것 같음....)

 

여하튼

n의 제곱근까지만 나눗셈을 해서 number 숫자가 커져도 효율적으로 코드가 돌아가도록..

여기서 squarRoot()가 제곱근을 나타낸다

 

squarRoot()

: 표현 가능한 값으로 반올림된 값의 제곱근을 반환

https://developer.apple.com/documentation/swift/double/squareroot()

 

squareRoot() | Apple Developer Documentation

Returns the square root of the value, rounded to a representable value.

developer.apple.com

 

//예시
func hypotenuse(_ a: Double, _ b: Double) -> Double {
    return (a * a + b * b).squareRoot()
}

let (dx, dy) = (3.0, 4.0)
let distance = hypotenuse(dx, dy)
// distance == 5.0

 

그래서 결론 코드

import Foundation

func solution(_ number:Int, _ limit:Int, _ power:Int) -> Int {
    var result = 0
    var arr:[Int] = []
    
    
    for n in 1...number {
        var divisorCount = 0
        
        for divisor in 1...Int(Double(n).squareRoot()){
            if n % divisor == 0 {
                divisorCount += 1
                if divisor != n / divisor {
                    divisorCount += 1
                }
            }
        }
        result += (divisorCount > limit) ? power : divisorCount
    }
    return result
}

 

 

이건 다른 사람의 풀이인데,,

import Foundation

func solution(_ number:Int, _ limit:Int, _ power:Int) -> Int {
    var attack = [Int](repeating: 0, count: number+1)

    for i in 1...number {
        var c = i

        while c <= number {
            attack[c] += 1
            c += i
        }
    }
    attack = attack.map { $0 > limit ? power : $0 }
    return attack.reduce(0, +)
}

엥 어떻게 이렇게 했지?! 했는데,, 각 숫자의 배수에 대해 카운트를 증가시킴으로써 간접적으로 약수의 개수를 계산하는 방법을 사용했다..!

흥미로운 코드였따


스탠다드반 강의
(스파르타 코딩 클럽)

 

스탠다드반 강의는 딱 내가 몰랐던(?) 궁금했던 것들을 잘 설명해 주셔서 유익한 느낌이다..

https://fluffy-brie-4fd.notion.site/4-bc0f51e45da44099ad92eb4813a20957#cfca2264f0cd4d1b9bf890cddd8d1598

 

SnapKit

: 오토레이아웃 코드를 보기 좋게 사용하기 위한 라이브러리

 

라이브러리 사용법 (ex.snapkit 라이브러리)

- snapkit github 검색하기

- snapkit git 파일 경로 복사

- 라이브러리를 사용하고자 하는 프로젝트 Package Dependencies 

- 플러스 버튼 눌러서 라이브러리 추가하기

- 우측 상단에 링크 붙여 넣기

- Add Package 클릭

- SnapKit-Dynamic의 타깃은 None으로!

- 라이브러리 import 완료


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

 

위시리스트에 테이블뷰에 대한 설정을 해준다!

원래는 xib로 구현하려고 했으나,, 어차피 id랑 title price 그냥 한 줄로 내보낼 건데 굳이... 하는 생각이 들어서 그냥 코드로 하기로 결정..

그리고 Cell에 identifier 설정해 주는 것을 잊으면 안 된다... ㅜ

Core Data에 저장된 값을 가져와서 cell에 표시해 준다!

 

이렇게 코드 잘 만들어주고 실행했는데,,

 

Thread 1: "-[UITableViewController loadView] instantiated view controller with identifier \"WishListViewController\" from storyboard \"Main\", but didn't get a UITableView."

저 오류 때문에 꽤나 고생을 했는데,,, 이유는 WishListViewController가 모달형식으로 올라와서 TableView가 와야 하는데 이전에는 UIView 위에 TableView가 있는 방식으로 설정되어 있어서 오류가 났던 것 같음.. 위에 대로 UIView를 삭제해 주고, TableView가 제일 먼저 오게(?) 해주면 잘 나옴!

 

위시리스트 담기를 눌렀을 때 화면!

 

근데 이게 저장소에 저장되는 거여서 그런가 나갔다 와도 데이터가 계속 유지되어 있음.. 신기했다..!

이것이 Core Data...?

 

막 눌렀던 거 너무 많이 저장되어서,, 삭제 기능 구현함!

 

그리고 글자 길면... 나오던 거도 거슬려서 설정해 주기!

오른쪽에 Identity Inspector에 Lines를 늘려주면... 이 안 뜨고 밑에 줄에 표시된다 10으로 설정했으니 10줄까지는... 없이 출력될 것이다

 

스토리보드로 버튼 모서리 둥글게 만들어주기!

https://jiwift.tistory.com/entry/iOSSwift-Button-%EB%AA%A8%EC%84%9C%EB%A6%AC-%EB%91%A5%EA%B8%80%EA%B2%8C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-%EC%BD%94%EB%84%88-corner-radius-Storyboard-%ED%99%9C%EC%9A%A9

 

[iOS/Swift] UIButton 모서리 둥글게 설정하기 / 코너 corner radius Storyboard 활용

UIKit을 사용하다 보면 Custom 하고 싶을 때가 있다. 방법은 라이브러리, 코드, Storyboard 등 사용하고 싶은 방법을 찾아서 적용하면 된다. 정답은 없으니깐 오늘은 일단 단순하게 모서리만 둥글게 만

jiwift.tistory.com

 

layer.masksToBounds / Boolean / true

layer.cornerRadius / Number / 원하는 값

 

버튼 모양이랑 이것저것 바꿔주기

근데 신기하게 내가 완료화면 캡처할 때마다 tea tree oil이 나오는 것 같음! ㅋㅋㅋㅋ

 

'TIL' 카테고리의 다른 글

38일차 TIL  (1) 2024.04.19
37일차 TIL  (3) 2024.04.18
35일차 TIL  (8) 2024.04.16
34일차 TIL  (4) 2024.04.15
33일차 TIL  (4) 2024.04.12