2125. Number of Laser Beams in a Bank
문제 설명
- 나온것처럼 2차원 배열로 경보장치가 주어진다.
- 가장 가까운층으로 쏟아내니까 그 레이저 개수를 구하면된다.
- 1층에서 2층거쳐서 3층 워프는 X
- 사진과 같음
문제 풀이
- 주어지는 배열이
["011001","000000","010100","001000"]
- 이런식으로 주어지면 이게 레이저 개수는 사실 1의 개수 * 가까운 층의 개수 +.. 반복이다
- 여기 예시로 보면 1층은 1개 2층은 2개 4층은 3개 니까
1X2 + 2X3 = 8
filter
사용해서 1개수 있을때만 이제 유효한 층별로 담긴 배열을 return 해주게 했다.
class Solution {
func numberOfBeams(_ bank: [String]) -> Int {
var answer = 0
var countingCCTV = [Int]()
if bank.count == 1 {
return 0
}
for row in bank {
let cnt = row.filter { $0 == "1" }.count // 보안장치의 개수
if cnt > 0 {
countingCCTV.append(cnt)
}
}
if countingCCTV.count == 0 {
return 0
}
for i in 0 ..< countingCCTV.count - 1 {
answer += (countingCCTV[i] * countingCCTV[i + 1])
}
return answer
}
}
if bank.count == 1 {
return 0
}
if countingCCTV.count == 0 {
return 0
}
타인의 코드
class Solution {
func numberOfBeams(_ bank: [String]) -> Int {
var prev = 0
var lasers = 0
for row in bank {
var curr = 0
for char in row {
curr += char == "1" ? 1 : 0
}
if curr > 0 {
lasers += prev * curr
prev = curr
}
}
return lasers
}
}
가장 효율 좋은 코드인데, 내가 초반부에 이렇게 풀다가 좀 틀었었다.
if curr > 0 { lasers += prev * curr prev = curr }
이 부분이 헷갈려서였다. 첫항은 어떻게? + 커서의 초기값은 어떻게 해야하지? , prev의 초기값을 0으로해주면 어처피 곱했을때도 문제없으니까 이렇게 해줬다.