-
[Swift] PassingCars 코딜리티 코딩테스트개발/Swift 2022. 3. 4. 13:12
A non-empty array A consisting of N integers is given. The consecutive elements of array A represent consecutive cars on a road. Array A contains only 0s and/or 1s: 0 represents a car traveling east, 1 represents a car traveling west. The goal is to count passing cars. We say that a pair of cars (P, Q), where 0 ≤ P < Q < N, is passing when P is traveling to the east and Q is traveling to the west. For example, consider array A such that: A[0] = 0 A[1] = 1 A[2] = 0 A[3] = 1 A[4] = 1 We have five pairs of passing cars: (0, 1), (0, 3), (0, 4), (2, 3), (2, 4). Write a function: class Solution { public int solution(int[] A); } that, given a non-empty array A of N integers, returns the number of pairs of passing cars. The function should return −1 if the number of pairs of passing cars exceeds 1,000,000,000. For example, given: A[0] = 0 A[1] = 1 A[2] = 0 A[3] = 1 A[4] = 1 the function should return 5, as explained above. Write an efficient algorithm for the following assumptions: N is an integer within the range [1..100,000]; each element of array A is an integer that can have one of the following values: 0, 1.
동쪽으로 가는 차와 서쪽으로 가는 차들이 마주치는 갯수를 세는방법이다.
그런데 위의 예시를 보면 동쪽으로 가는 차 a[2]는 서쪽으로 가는 a[1]차를 마주치지 않느다.
2보다 먼저 온 서쪽으로 가는 차는 안마주친다고 보면된다.
해결방법은 우선 동쪽으로 가는 차가 나오면
그 다음 배열을 잘라서 서쪽으로 가는 차만 필터링한후에 카운팅을 늘리는 방식을 했다.
public func solution(_ A : inout [Int]) -> Int { // write your code in Swift 4.2.1 (Linux) var answer = 0 for i in 0..<A.count{ if(A[i] == 0) { let afterArr = A.suffix(A.count-(i+1)) let filteredArr = afterArr.filter({$0 == 1 }) answer += filteredArr.count if(answer > 1000000000){return -1} } } return answer }
정답은 맞췄으나 o(n ** 2) 시간 초과가 나왔다.
배열을 잘라내고 필터링 하는 과정이 시간초과를 불렀다.
그래서 해결 방법을 바꿔보았다.
동쪽으로 가는 차가 나오면 pCount를 1 올려준다.
그다음 서쪽으로 가는 차가 나오면 pCount 를 answer 값에 더해준다.
예로 동쪽으로 가는 차가 2개 나오고 그후에 서쪽 차가 나오면 ([0,0,1])
pCount는 2 가 되고 2만큼을 더해주면 된다.
public func solution(_ A : inout [Int]) -> Int { // write your code in Swift 4.2.1 (Linux) var pCount = 0 var answer = 0 for i in 0..<A.count{ if(A[i] == 0) {pCount += 1} else{ answer += pCount } if(answer > 1000000000){return -1} } return answer }
'개발 > Swift' 카테고리의 다른 글
[Swift] countFactors 약수구하기 코딜리티 코딩테스트 (0) 2022.03.05 [Swift] Dominator 코딜리티 코딩테스트 (0) 2022.03.04 [Swift] FrogRiverOne 코딜리티 코딩테스트 (0) 2022.03.04 인스턴스 메소드/ 클래식 메소드/ 스태틱 메소드 (0) 2022.03.01 RxSwift 는 무엇일까 (0) 2022.02.19