작성일 :

문제 링크

27983번 - 리본 (Easy)

설명

문제의 목표는 주어진 리본들 중에서, ‘서로 다른 색을 가진 두 리본’ 을 선택하여 ‘아름다운 매듭’ 을 만들 수 있는지 확인하고,

가능하다면 그러한 리본의 쌍을 찾는 것입니다.

매듭을 지을 수 있는 조건은 다음과 같습니다.

  • 두 리본의 위치 차이가 두 리본의 기링 합 보다 작거나 같아야 함

  • 두 리본의 색이 서로 달라야 함


각 리본의 위치, 길이, 그리고 의 정보를 입력받아 저장합니다.

이후, 모든 리본 쌍에 대해서 완전 탐색 방법으로 두 조건을 검사합니다.


  • 거리 조건 : 두 리본 사이의 거리가 두 리본의 길이의 합 보다 작거나 같은지 확인

  • 색상 조건 : 두 리본의 색상이 다른지 확인


위 두 조건을 모두 만족하는 리본 쌍이 있다면 "YES" 를 출력하고, 해당 리본들의 번호 를 출력합니다.

만약, 모든 리본 쌍을 검사했음에도 불구하고 조건을 만족하는 쌍을 찾지 못했다면, "NO" 를 출력합니다.




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
namespace Solution {
  class Program {

    struct Ribbon {
      public int Pos, Len;
      public char Color;
    }

    static void Main(string[] args) {

      var n = int.Parse(Console.ReadLine()!);
      var ribbons = new Ribbon[n];
      var positions = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
      var lengths = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
      var colors = Console.ReadLine()!.ToCharArray();

      for (int i = 0; i < n; i++)
        ribbons[i] = new Ribbon {Pos = positions[i], Len = lengths[i], Color = colors[i * 2]};

      var result = ribbons
        .SelectMany((ribbon, i) =>
          ribbons
            .Skip(i + 1)
            .Select((other, j) =>
              new {Ribbon_1 = ribbon, Ribbon_2 = other, Index_1 = i, Index_2 = i + j + 1}))
        .FirstOrDefault(pair =>
          Math.Abs(pair.Ribbon_1.Pos - pair.Ribbon_2.Pos) <= pair.Ribbon_1.Len + pair.Ribbon_2.Len &&
                   pair.Ribbon_1.Color != pair.Ribbon_2.Color);

      if (result != null) Console.WriteLine($"YES\n{result.Index_1 + 1} {result.Index_2 + 1}");
      else Console.WriteLine("NO");

    }
  }
}



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

using namespace std;

struct Ribbon {
  int pos, len;
  char color;
};

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

  int n; cin >> n;
  vector<Ribbon> ribbons(n);

  for (int i = 0; i < n; i++) cin >> ribbons[i].pos;
  for (int i = 0; i < n; i++) cin >> ribbons[i].len;
  for (int i = 0; i < n; i++) cin >> ribbons[i].color;

  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      if (abs(ribbons[i].pos - ribbons[j].pos) <= ribbons[i].len + ribbons[j].len &&
          ribbons[i].color != ribbons[j].color) {
        cout << "YES\n" << i + 1 << " " << j + 1 << "\n";
        return 0;
      }
    }
  }

  cout << "NO\n";

  return 0;
}