비어 있지 않은 정수 배열 A가 주어집니다.
배열 A의 연속된 원소들은 도로 위를 달리는 연속된 자동차를 나타냅니다.
배열 A는 0과 1로만 이루어져 있습니다:
- 0은 동쪽으로 가는 자동차를 의미합니다.
- 1은 서쪽으로 가는 자동차를 의미합니다.
목표는 지나치는 자동차 쌍을 세는 것입니다.
우리는 (P, Q)라는 자동차 쌍이 다음 조건을 만족할 때 "지나친다(passing)"라고 정의합니다:
0 ≤ P < Q < N,
그리고 P는 동쪽으로 가고 (A[P] = 0),
Q는 서쪽으로 가는 경우 (A[Q] = 1).
예시:
배열 A가 다음과 같을 때:
A[0] = 0, A[1] = 1, A[2] = 0, A[3] = 1, A[4] = 1
이 경우 지나치는 자동차 쌍은 다음과 같습니다:
(0,1), (0,3), (0,4), (2,3), (2,4)
총 5쌍이므로 결과는 5입니다.
---
구현 조건:
다음 함수를 작성하세요:
class Solution {
public int solution(int[] A);
}
이 함수는 배열 A가 주어졌을 때, 지나치는 자동차 쌍의 개수를 반환합니다.
만약 쌍의 개수가 1,000,000,000을 초과하면 -1을 반환해야 합니다.
---
추가 조건:
- N의 범위: [1..100,000]
- 배열 A의 각 원소는 0 또는 1만 가질 수 있습니다.
|
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
public class PassingCars
{
// O(n^2) 버전
public int solution(int[] A)
{
// 결국, 동쪽으로 가는차의 인덱스를 찾고,
// 그 인덱스 뒤에 서쪽으로 가는 차의 개수를 세면 된다.
int passingCount = 0;
for (int i = 0; i < A.Length; i++)
{
if (A[i] == 0)
{
for (int j = i + 1; j < A.Length; j++)
{
if (A[j] == 1)
{
passingCount++;
if (passingCount > 1000000000)
return -1;
}
}
}
}
return passingCount;
}
// O(n) 버전
public int solution2(int[] A)
{
int passingCount = 0;
int eastCarCount = 0;
for (int i = 0; i < A.Length; i++)
{
if (A[i] == 0)
{
// 동쪽으로 가는 차의 개수를 세고,
eastCarCount++;
}
else
{
// 서쪽으로 가는 차를 만날 때마다 동쪽으로 가는 차의 개수를 더해줌
passingCount += eastCarCount;
if (passingCount > 1000000000)
return -1;
}
}
return passingCount;
}
}
|
cs |
'코딜리티 > Lesson' 카테고리의 다른 글
| GenomicRangeQuery (누적합) (0) | 2025.09.18 |
|---|---|
| CountingDiv (0) | 2025.09.17 |
| MaxCounters (지연 갱신) (0) | 2025.09.15 |
| PermCheck (순열) (0) | 2025.09.15 |
| FrogRiverOne (0) | 2025.09.15 |