본문 바로가기

Algorithm/Brute-force

[C++] 백준 4641번 : Doubles (B1)

#문제

https://www.acmicpc.net/problem/4641

 

4641번: Doubles

문제 2~15개의 서로 다른 자연수로 이루어진 리스트가 있을 때, 이들 중 리스트 안에 자신의 정확히 2배인 수가 있는 수의 개수를 구하여라. 예를 들어, 리스트가 "1 4 3 2 9 7 18 22"라면 2가 1의 2배, 4�

www.acmicpc.net

#풀이

이러한 유형의 문제가 처음 이해가 잘 되지 않았다. 그 이유는

<문제의 입출력 예시>

이와 같은 입출력 예시를 보고 왼쪽의 숫자들의 입력이 모두 끝나면 오른쪽과 같이 출력이 돼야 한다고 생각했기 때문이다. 하지만 "각 테스트 케이스마다 한 줄에 걸쳐 정답을 출력한다."라는 의미는 다음과 같았다.

 

<올바른 출력 형태>

테스트 케이스를 입력할 때마다 정답이 출력되는 형태인 것이다. 이와 비슷한 문제를 계속해서 보게 될 텐데 이러한 형태로 입출력이 진행된다는 사실을 반드시 인지해야겠다.

이번 문제에서 자기자신과 자기자신을 제외한 나머지를 모두 비교해야 했는데, 이는 [C++] 백준 7568번 : 덩치 (S5)와 같은 방법으로 이중for문을 이용한다. 이때, 자기자신은 자기자신의 2배가 될 수 없으므로 자기자신끼리 비교하는 경우는 자연스럽게 제외된다.

#소스코드

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
#include<iostream>
using namespace std;
 
int find_doubles(int* arr, int len) {
    int cnt = 0;
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
            if (arr[j] == arr[i] * 2)
                cnt++;
        }
    }
    return cnt;
}
 
int main(void)
{
    int arr[20];
    int num = -100;
    int cnt = 0;
 
    while (num != -1) {
        cin >> num;
        if (num == 0) {
            cout << find_doubles(arr, cnt) << endl;
            cnt = 0;//다음 test case를 위해
        }
        else {
            arr[cnt] = num;
            cnt++;
        }
    }
 
    return 0;
}
cs