작성일 :

문제 링크

4641번 - Doubles

설명

각 테스트 케이스마다 여러 자연수가 주어질 때, 그중 리스트 안에 자신의 정확히 두 배인 수가 함께 있는 수의 개수를 구하는 문제입니다.


접근법

한 줄의 수들을 모두 읽어 집합에 넣은 뒤, 각 수에 대해 두 배 값이 집합에 있는지 확인하면 됩니다. 입력 줄의 끝은 0, 전체 입력의 끝은 -1로 구분합니다.



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

class Program {
  static void Main() {
    while (true) {
      var parts = Console.ReadLine()!.Split();
      if (parts[0] == "-1")
        break;

      var nums = new List<int>();
      var set = new HashSet<int>();

      foreach (var s in parts) {
        var x = int.Parse(s);
        if (x == 0)
          break;
        nums.Add(x);
        set.Add(x);
      }

      var count = 0;
      foreach (var x in nums) {
        if (set.Contains(x * 2))
          count++;
      }

      Console.WriteLine(count);
    }
  }
}

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

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

  while (true) {
    int x;
    cin >> x;
    if (x == -1)
      break;

    vector<int> nums;
    unordered_set<int> st;

    while (x != 0) {
      nums.push_back(x);
      st.insert(x);
      cin >> x;
    }

    int count = 0;
    for (int v : nums) {
      if (st.count(v * 2))
        count++;
    }

    cout << count << "\n";
  }

  return 0;
}

Tags: 4641, BOJ, C#, C++, 구현, 백준, 알고리즘, 집합

Categories: ,