[백준 27983] 리본 (Easy) (C#, C++) - soo:bak
작성일 :
문제 링크
설명
문제의 목표는 주어진 리본들 중에서, ‘서로 다른 색을 가진 두 리본’ 을 선택하여 ‘아름다운 매듭’ 을 만들 수 있는지 확인하고,
가능하다면 그러한 리본의 쌍을 찾는 것입니다.
매듭을 지을 수 있는 조건은 다음과 같습니다.
- 두 리본의 위치 차이가 두 리본의 기링 합 보다 작거나 같아야 함
- 두 리본의 색이 서로 달라야 함
각 리본의 위치
, 길이
, 그리고 색
의 정보를 입력받아 저장합니다.
이후, 모든 리본 쌍에 대해서 완전 탐색 방법으로 두 조건을 검사합니다.
- 거리 조건 : 두 리본 사이의 거리가 두 리본의 길이의 합 보다 작거나 같은지 확인
- 색상 조건 : 두 리본의 색상이 다른지 확인
위 두 조건을 모두 만족하는 리본 쌍이 있다면 "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;
}