작성일 :

문제 링크

27487번 - One and Two

설명

1과 2로만 이루어진 수열이 주어질 때 곱이 같아지도록 나눌 수 있는 가장 작은 위치를 찾는 문제입니다.


접근법

먼저 곱의 차이는 2의 개수로만 결정되므로 양쪽의 2 개수가 같아야 합니다.

다음으로 전체 2의 개수가 홀수면 불가능하므로 -1을 출력합니다.

이후 2가 하나도 없다면 어떤 위치든 가능하므로 가장 작은 1을 출력합니다.

마지막으로 왼쪽에서 2의 개수를 세어 절반에 처음 도달하는 위치를 출력합니다.



Code

C#

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
using System;
using System.Text;

class Program {
  static void Main() {
    var parts = Console.In.ReadToEnd().Split();
    var idx = 0;
    var t = int.Parse(parts[idx++]);
    var sb = new StringBuilder();

    for (var tc = 0; tc < t; tc++) {
      var n = int.Parse(parts[idx++]);
      var arr = new int[n];
      var total2 = 0;
      for (var i = 0; i < n; i++) {
        var v = int.Parse(parts[idx++]);
        arr[i] = v;
        if (v == 2) total2++;
      }

      if (total2 % 2 == 1) {
        sb.AppendLine("-1");
        continue;
      }
      if (total2 == 0) {
        sb.AppendLine("1");
        continue;
      }

      var need = total2 / 2;
      var cnt = 0;
      var ans = -1;
      for (var i = 0; i < n; i++) {
        if (arr[i] == 2) cnt++;
        if (cnt == need) {
          ans = i + 1;
          break;
        }
      }
      sb.AppendLine(ans.ToString());
    }

    Console.Write(sb);
  }
}

C++

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
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int t; cin >> t;
  
  while (t--) {
    int n; cin >> n;
    vector<int> arr(n);
    int total2 = 0;
    for (int i = 0; i < n; i++) {
      cin >> arr[i];
      if (arr[i] == 2) total2++;
    }

    if (total2 % 2 == 1) {
      cout << -1 << "\n";
      continue;
    }
    if (total2 == 0) {
      cout << 1 << "\n";
      continue;
    }

    int need = total2 / 2;
    int cnt = 0;
    int ans = -1;
    for (int i = 0; i < n; i++) {
      if (arr[i] == 2) cnt++;
      if (cnt == need) {
        ans = i + 1;
        break;
      }
    }
    cout << ans << "\n";
  }

  return 0;
}