작성일 :

문제 링크

5217번 - 쌍의 합

설명

1 이상 12 이하의 두 자연수의 합이 주어진 수가 되도록 만들 수 있는 모든 서로 다른 쌍을 출력하는 문제입니다.

  • 각 테스트케이스마다 하나의 자연수가 주어집니다.
  • 1부터 12까지의 수 중에서 두 수를 더했을 때 주어진 수가 되는 모든 쌍 (a, b) 를 구합니다.
  • 단, (a, b)(b, a)는 같은 쌍으로 간주하므로, 중복 없이 오름차순으로 출력해야 합니다.
  • 출력 형식은 "Pairs for n: " 이후 쌍들을 "a b" 형태로 쉼표로 구분하여 출력합니다.

예시 입력:

1
2
3
4
3
6
10
11

예시 출력:

1
2
3
Pairs for 6: 1 5, 2 4
Pairs for 10: 1 9, 2 8, 3 7, 4 6
Pairs for 11: 1 10, 2 9, 3 8, 4 7, 5 6

접근법

  1. 테스트케이스 수를 입력받습니다.
  2. 각 테스트케이스마다 목표 합을 입력받습니다.
  3. 두 수를 더해서 목표 값이 되는지 확인합니다.
    • 첫 번째 수는 1부터 시작하며 두 번째 수 > 첫 번째 수 조건이 유지되도록 반복합니다.
    • 두 수 모두 1~12 범위에 속해야 하며 중복된 순서는 출력하지 않습니다.
  4. 여러 쌍을 출력할 때는 쉼표 형식을 고려하여 첫 쌍 여부를 따로 관리합니다.

Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;

class Program {
  static void Main() {
    int count = int.Parse(Console.ReadLine());
    while (count-- > 0) {
      int num = int.Parse(Console.ReadLine());
      Console.Write($"Pairs for {num}: ");

      bool isFirst = true;
      for (int i = 1; i < num - i && i <= 12; i++) {
        int j = num - i;
        if (j <= i || j > 12) continue;

        if (!isFirst) Console.Write(", ");
        Console.Write($"{i} {j}");
        isFirst = false;
      }
      Console.WriteLine();
    }
  }
}

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

using namespace std;

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

  int t; cin >> t;
  while (t--) {
    int num; cin >> num;
    cout << "Pairs for " << num << ": ";

    bool firstPair = true;
    for (int first = 1; first < num - first && first < 12; first++) {
      int second = num - first;
      if (second <= first || second > 12) continue;
      if (!firstPair) cout << ", ";
      cout << first << " " << second;
      firstPair = false;
    }
    cout << "
";
  }

  return 0;
}