일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ios
- Privacy manifest
- launchscreen
- Native Module
- 네이티브
- boilerplate 제거
- 앱 성능 개선
- launch screen
- React Native
- 360도 이미지 뷰어
- 라이브러리 없이
- 3b52.1
- 리엑트 네이티브
- 스켈레톤 통합
- 360도 이미지
- 스켈레톤 UI
- 스플래시스크린
- Android
- React-Native
- react
- 리액트
- panorama view
- react-native-fast-image
- 리액트 네이티브
- 360도 뷰어
- Skeleton UI
- native
- privacyinfo.plist
- 파노라마 뷰
- requirenativecomponent
- Today
- Total
Neoself의 기술 블로그
알고리즘 지식 정리(10월 13일)[프로그래머스 레벨 1] 본문
약수의 개수와 덧셈
func addMinus(_ left:Int, _ right:Int) -> Int {
var ans = 0
for i in left...right {
var cnt=1 // 원래 수
if i != 1 {
for a in 1...i/2 {
if i%a==0 {cnt+=1}
}
}
ans += cnt%2==0 ? i : -i
}
return ans
}
... 연산자를 활용하여 순회할 범위를 지정한 다음, 매 순회마다 %연산자로 약수인지 여부를 파악하였다. 이때 시간복잡도를 줄이고자 순회하는 범위를 i가 아닌 i/2로 축소하였는데, 이의 경우 i가 1일 경우는 1...0을 참조하는 즉 core dumped 문제가 발생할 수 있기 때문에 예외처리를 진행해주었다. 또한 범위가 축소됨에 따라 약수범위에 본인이 포함되지 않기 때문에 cnt 초기값을 1로 지정하여 이를 사전에 포함시켜주었다.
문자열 내림차순으로 배치하기
func solution(_ s:String) -> String {
var lower = Array(s).filter{$0.isLowercase}.map{String($0)}
var upper = Array(s).filter{$0.isUppercase}.map{String($0)}
return lower.sorted(by: >).joined()+upper.sorted(by: >).joined()
//return String(s.sorted { $0 > $1 }) ?????
}
String으로 이루어진 배열 또한 sorted() 함수 적용 시, 알파벳 순서에따라 정렬이 된다. 이를 활용하여 인자 String을 Array로 변환 후, 마지막에 joined() 처리를 하였다.
부족한 금액 계산하기
func calculatePrice(_ price:Int, _ money:Int, _ count:Int) -> Int64{
var total = (1...count).reduce(0,{$0+$1*price})
return total>=money ? Int64(total-money) : Int64(0
}
이용횟수와 놀이기구 초기 이용료로 이루어진 총 비용을 ... 연산자로 구성된 튜플, reduce함수로 구성해주었다.
문자열 다루기 기본
func handleString(_ s:String) -> Bool {
return Int(s) != nil && (Array(s).count == 4 || Array(s).count == 6)
}
Int타입으로 변환을 시도할때, 본래 String값이 숫자로만 이루어지지 않았다면 nil을 반환한다. 이를 활용하여 숫자만 있는지 여부를 파악하고, String의 길이를 성능저하없이 파악하기 위해 Array 변환 후 count 호출로 String 길이까지 파악하는 로직을 구성했다.
행렬의 덧셈
func addition(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
return arr1.enumerated().map{(id,arr) in arr.enumerated().map{(_id,num) in num+arr2[id][_id]}}
}
enumerated()를 활용하여 map 고차함수에서 index값을 접근하였으며, 2차원 배열이기에 map을 이중으로 사용하여 요소 간 덧셈을 진행하였다.
func addition(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
return zip(arr1, arr2).map{zip($0,$1).map{$0+$1}}
}
다른 사람의 코드를 보니 zip 함수를 통해 시퀀스 간 연산을 아주 깔끔하게 진행하였다,... 현재 문제의 경우 두개 시퀀스 길이가 동일하지만, 만일 다른 길이의 두 시퀀스를 zip 함수로 접근할 경우, 더 짧은 것의 길이만큼 시퀀스를 최종 반환한다.
- 외부 zip(arr1,arr2)를 통해 두개 2차원 배열의 행을 짝짓는다
- 첫번째 map을 통해 각 행에 대해 연산 수행
- 내부 zip($0,$1)을 통해 행의 각 요소를 다시 짝짓는다.
감사합니다.
'개발지식 정리 > 알고리즘' 카테고리의 다른 글
알고리즘 지식 정리(10월 15일)[프로그래머스 레벨 1] (2) | 2024.10.15 |
---|---|
알고리즘 지식 정리(10월 14일)[프로그래머스 레벨 1] (0) | 2024.10.14 |
알고리즘 지식 정리(10월 12일)[프로그래머스 레벨 1] (2) | 2024.10.12 |
알고리즘 지식 정리(10월 11일)[프로그래머스 레벨 1] (0) | 2024.10.12 |
알고리즘 지식 정리(10월 8일)[프로그래머스 레벨 2] (1) | 2024.10.08 |