오늘도 역시나 알고리즘이다
개인과제에 대한 마감과 해설영상이 오늘 올라온다고 하니
주말동안에는 개인 과제에 대한 TIL를 작성하려고 한다.
행렬 문제가 나왔다
2차원 배열을 사용한것이라 2중 for문을 써야겠다고 생각
별로 좋아하는 방식은 아니지만 일단 go
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
var result: [[Int]] = []
var sum: [Int] = []
for i in 0..<arr1.count {
for j in 0..<arr2.count {
sum.append(arr1[i][j] + arr2[i][j])
}
result.append(sum)
}
return result
}
처음에 이렇게 작성했는데 계속 실패가 떴다.
습 왜그러지 했는데 sum배열의 선언을 첫번째 반복문 안에서 해줘야 했던것
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
var result: [[Int]] = []
for i in 0..<arr1.count {
var sum: [Int] = []
for j in 0..<arr1[i].count {
sum.append(arr1[i][j] + arr2[i][j])
}
result.append(sum)
}
return result
}
이렇게 수정해주니 해결!
여튼 풀기는 했지만 이중 반복문 쓰는게 마음에 안들어서 다른 사람들 풀이를 봤다
대부분 비슷한 풀이인데 눈에 띄는 풀이 한개가 있었더
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
return zip(arr1, arr2).map{zip($0,$1).map{$0+$1}}
}
바로 요 풀이인데
고차함수를 굉장히 잘 활용하셨다
궁금해서 실행해보니 전과 마찬가지로 실행시간이 굉장히 많이 늘었지만 코드 자체는 깔끔하다
테스트17에서 이중 반복문은 21.60ms
위의 고차함수는 89.86ms
음 별찍기 문제 안 좋아하지만..
처음 느낌은 받은 n과 m 변수로 (repeating:count:)
를 써서 작성하면 되겠다고 생각했는데
주어진 기본? 코드가 아래와 같았다
let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! }
let (a, b) = (n[0], n[1])
print(a + b)
이걸 보아하니 이전처럼 함수에 바로 파라미터를 넘겨주는 것이 아니라 readLine()
을 통해 키보드 입력을 받는 방식인것같다
아무튼~ 나는 일단 아래처럼 풀이를 했다
func sqaureStar(row: Int, col: Int) {
let starRow = String(repeating: "*", count: row)
for _ in 1...col {
print(starRow)
}
}
sqaureStar(row: a, col: b)
기본 코드부분 제외하고 함수 부분과 호출 부분만 올린다
아까 위에서 언급한 (repeating:count:)
를 통해서 한줄의 별의 개수를 정하고 반복문을 통해 필요한 만큼의 줄을 만들었다
for _ in 0..<b {
print(Array(repeating: "*", count: a).joined())
}
아 요렇게 변수를 지정안하고 바로 작성하면 코드를 좀 더 줄일 수 있겠다. 참고로 다른 사람의 풀이.
음 약수는 그동안 쉽게 구했는데
최대공약수와 최소공배수에서 멈칫했다
잠깐 구글링을 해보니 유클리드 호제법
을 이용하면 쉽게 구할 수 있다고 한다.
유클리드 호제법의 과정은 다음과 같은데
- 큰 수를 작은 수로 나눈다.
- 나누는 수를 나머지로 계속 나눈다.
- 나머지가 0이 나오면 나누는 수가 최대공약수이다.
이걸 이용해서 최대공약수를 구하는 것이다
실제 코드로 구현한 것을 보자
func gcd(_ a: Int, _ b: Int) -> Int {
if b == 0 {
return a
} else {
return gcd(b, a%b)
}
}
func solution(_ n:Int, _ m:Int) -> [Int] {
var gcdV = gcd(n, m)
let lcm = n * m / gcdV
return [gcdV, lcm]
}
음.. 이 유형은 처음 보기도 했지만 익숙하지가 않아서 추후 비슷한 유형의 문제를 만나면 다시 정리해보면서 복기해야겠다
정리 너무 깔끔하네요! 알고리즘 엄청 많이 푸시는군요...