[programemrs] LV0 정리
하다가 약간 헤맸던 부분 / 한번 틀리고 다시 시도했던 / 여러가지 방법이 있는 LV0 정리
- 1번 각도기
- 2번 배열 원소의 길이
- 3번 배열의 유사도
- 4번 각도기
- 5번 n의 배수 고르기
- 6번 문자열안의 문자열
- 7번 세균증식
- 8번 피자나눠먹기(1)
- 9번 피자나눠먹기(2)
- 10번 피자나눠먹기(3)
1. 각도기
각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.
내 소스 :
swift 언어 공부를 전혀 하지 않고 쓴 코드...
import Foundation
func solution(_ angle:Int) -> Int {
if angle > 90 && angle < 180{
return 3
}
else if angle == 90{
return 2
}
else if angle == 180{
return 4
}
else{
return 1
}
}
참고하면 좋은 소스 :
import Foundation
func solution(_ angle:Int) -> Int {
return angle < 90 ? 1 : angle == 90 ? 2 : angle < 180 ? 3 : 4
}
삼항조건부 연산자를 사용함.
:을 구분자삼아 조건문 ? 리턴값 을 따른다. 위 코드를 해석하면
angle < 90? 1 --> if(angle <90)이라면 return 1
: angle == 90 ? 2 --> if(angle == 90)이라면 return 2
: angle <180 ? 3 --> if(angle <180)이라면 return 3
: 4 --> else 이라면 return 4
if bool형이라면 :를 기반으로 앞에 있는게 참 리턴 값, 뒤에 있는게 거짓 리턴값이다.
- let contentHeight = 40
- let hasHeader = true
- let rowHeight = contentHeight + (hasHeader ? 50 : 20)
- // rowHeight is equal to 90
여기선 hashHeader가 참이므로 40+50인 90이 나온다.
2. 배열 원소의 길이
문자열 배열 strlist가 매개변수로 주어집니다.
strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.
내 소스 :
import Foundation
func solution(_ strlist:[String]) -> [Int] {
var answer:[Int] = []
for i in 0..<(strlist.count){
answer.append(strlist[i].count)
}
return answer
}
strlist의 길이( 리스트 원소의 개수) 만큼 for문을 돌리고, 인덱스에 해당하는 strlist의 길이를 answer이라는 list에 append하여 return한다.
참고하면 좋은 소스 1:
import Foundation
func solution(_ strlist:[String]) -> [Int] {
var result: [Int] = []
for str in strlist {
result.append(str.count)
}
return result
}
왜 굳이 for문을 돌렸던걸까??? swift가 쉽게 길을 내줬는데 내가 굳이굳이 돌아가고있었다...
몰랐던 점 :
(1) 굳이 index로 접근하지 않아도
for str in strlist로 원소 하나하나에 접근가능하구나
(2) length()이 아니라 .count로 문자열의 개수를 셀 수 있구나.
++)
배열의 문자열이 비여있을때 .count == 0이라고 if문을 줘도 되지만, swift에는 isEmpty라는 편리한 함수가 존재한다
참고하면 좋은 소스 2:
import Foundation
func solution(_ strlist:[String]) -> [Int] {
return strlist.map({ $0.count })
}
map이란?
https://developer.apple.com/documentation/swift/set/map(_:)-87c44
Apple Developer Documentation
developer.apple.com
map은 swift의 고차함수로, 데이터 변환이 가능하다. 예제 코드는 아래와 같다.
새로운 형태로 저장이 가능하다.
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]
3. 배열의 유사도
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
내 소스 :
import Foundation
func solution(_ s1:[String], _ s2:[String]) -> Int {
var count = 0
for i in s1{
for j in s2{
if(i == j){
count+=1
}
else
{
}
}
}
return count
}
하하~ swift공부 전 쓴 코드다. 이중for문을 사용했다.
참고하면 좋은 소스 :
import Foundation
// 고차함수 -> 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수.
// filter는 데이터를 추출할 때 사용한다.
func solution(_ s1:[String], _ s2:[String]) -> Int {
return s1.filter{s2.contains($0)}.count
}
filter란?
https://developer.apple.com/documentation/swift/set/filter(_:)
Apple Developer Documentation
developer.apple.com
filter는 데이터를 추출할 때 사용되는 고차함수이다.
아래 예제는
cast라는 set의 원소 하나의 길이가 5미만인 요소만 추출하여 shortNames 에 넣는다는 뜻이다.
let cast: Set = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
shortNames.isSubset(of: cast)
// true
shortNames.contains("Vivien")
// false
4. n의 배수
정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.
내 코드 :
// import Foundation
// func solution(_ n:Int, _ numlist:[Int]) -> [Int] {
// var result:[Int] = []
// for i in numlist{
// if i % n == 0{
// result.append(i)
// }
// }
// return result
// }
import Foundation
func solution(_ n:Int, _ numlist:[Int]) -> [Int] {
var result:[Int] = []
result.append(contentsOf:numlist.filter{$0 % n == 0})
return result
}
위 주석처리된 코드는 고차함수 공부하기 전.
아래는 filter라는 함수를 알게 된 후 쓴 코드.
각 요소를 n으로 나눴을때 나머지가 0인 요소만 result라는 int형 list에 append한다는 뜻.
참고하면 좋을 소스1 :
import Foundation
func solution(_ n:Int, _ numlist:[Int]) -> [Int] {
var result: [Int] = []
for i in numlist where i % n == 0 {
result.append(i)
}
return result
}
몰랐던 점 :
신기하다! sql문 처럼 where 조건절을 써도 되는구나!
참고하면 좋을 소스2 :
import Foundation
func solution(_ n: Int, _ numList: [Int]) -> [Int] { numList.filter { $0 % n == 0 } }
위에서 배운 filter함수를 사용하면 더 코드를 짧게 사용가능하다!
5. 자릿수 더하기
정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요
내 소스 :
import Foundation
func solution(_ n:Int) -> Int {
var result:Int = 0
for i in String(n) {
result += Int(String(i))
}
return result
}
n을 string으로 가져와 각 자릿수를 더한다.
참고하면 좋은 소스 :
import Foundation
func solution(_ n:Int) -> Int {
return String(n).map{Int(String($0))! }.reduce(0,+)
}
reduce란?
https://developer.apple.com/documentation/swift/set/reduce(_:_:)
Apple Developer Documentation
developer.apple.com
주로 원소를 모두 합칠때 사용이 된다.
아래 예제 코드에서
0은 _ initialResult: Result 로 초기 누적값이다.
{x,y in x +y}는 누적 값과 시퀀스의 요소를 새로운 누적 값으로 결합하여 클로저의 다음 호출에 사용되거나 호출자에게 반환되는 클로저이다.
let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
x + y
})
// numberSum == 10
6. 문자열 안에 문자열
문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.
내 소스 :
import Foundation
func solution(_ str1:String, _ str2:String) -> Int {
if str1.contains(str2){
return 1
}
else
{
return 2
}
}
str1에 str을 포함한다면 return 1, 아니면 return2다.
참고하면 좋은 소스 :
import Foundation
func solution(_ str1:String, _ str2:String) -> Int { str1.contains(str2) ? 1 : 2 }
삼항조건부를 사용한다.
7. 세균증식
어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.
내 소스 :
import Foundation
func solution(_ n:Int, _ t:Int) -> Int {
return n * Int(pow(2.0,Double(t)))
}
pow란?
https://developer.apple.com/documentation/foundation/1779833-pow
Apple Developer Documentation
developer.apple.com
func pow( _ x: Decimal, _ y: Int ) -> Decimal로,
예를 들면 pow(2,3)이면 2의 3승인것이다.
위 문제는 1시간에 2배씩 증가하므로 t시간 후의 세균의 수는 n * 2^t이 된다. 그러므로 pow함수를 이용하여
위와 같이 짜면된다~
8. 피자나눠먹기(1)
머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.
import Foundation
func solution(_ n:Int) -> Int {
var result = 0
if Int(n/7) <= 1{
result = 1
}
else{
if(Int(n%7) != 0){
result = (n/7)+1
}
else{
result = n/7
}
}
return result
}
나는 위와같이 코드를 짰다. ( 바보같았다!)
참고하면 좋은 소스 :
import Foundation
func solution(_ n:Int) -> Int {
return n%7 == 0 ? n/7 : n/7+1
}
만약 명수가 7의 배수라면 몫만큼의 피자판이 필요하다.
7의배수가 아닌 수라면 몫 +1판만큼이 필요하다. 3 / 7 = 0...3 이므로, 위와 같이 한줄로 표현 가능하다
삼항연산자를 사용한다!!
9. 피자나눠먹기(2)
머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.
import Foundation
func solution(_ n:Int) -> Int {
func gcd(_ a: Int, _ b: Int) -> Int {
if b == 0 {
return a
} else {
return gcd(b, a%b)
}
}
var m = gcd(n,6)
return n/m
}
모두 같은 조각을 먹어야하므로, n과 6의 최소공배수만큼의 조각이 필요하다.
그러므로 n에 n과 6의 최대공약수를 나누었을때 몫만큼의 판이 필요하다.