728x90
문제링크
https://www.acmicpc.net/problem/1343
문제
민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB
이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다.
폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.
조건
시간제한 : 1초
메모리 제한 : 128 MB
입력
첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.
출력
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
문제정리
이번 문제의 경우 간단한 방법과 조금 생각해서 구현하는 것으로 두가지 방법을 통해서 풀었습니다.
첫번째로 'X'를 카운팅하다가 '.' 나오면 출력해주는 방식으로 풀이를 하였습니다.
카운팅 'X'의 개수가 홀수이면 -1을 출력하고 짝수이면 'AAAA'와 'BB'로 변형해서 출력하였으며,
'.'이 한번도 나오지 않은경우를 위해 반복문이 끝나고 한번더 검사하였습니다.
두번째로
Replace를 이용하여 XXXX와 XX를 AAAA와 BB로 모두 변경 시켜주고 X가 하나라도 있으면 -1을 출력하는 코드입니다.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
StreamWriter writer = new StreamWriter(OpenStandardOutput());
StreamReader reader = new StreamReader(OpenStandardInput());
string input = reader.ReadLine();
int count = 0;
for (int i = 0; i < input.Length; i++)
{
if (input[i] == 'X') // X가 나올 때마다 카운팅
{
count++;
}
else
{
if (count % 2 == 1) // '.'이 나왔을 때 카운팅된 개수가 홀수이면 -1 출력
{
sb = new StringBuilder();
sb.Append(-1);
break;
}
Counting(); // 입력받은 X의 개수만큼 AAAA와 BB 출력
sb.Append(".");
}
}
if (count > 0) // .이 한번도 나오지 않은경우 예외처리 실행
{
if (count % 2 == 1)
{
sb = new StringBuilder();
sb.Append(-1);
}
else
Counting();
}
writer.WriteLine(sb);
writer.Close();
reader.Close();
void Counting()
{
while (count != 0)
{
if (count >= 4)
{
sb.Append("AAAA");
count -= 4;
}
else
{
sb.Append("BB");
count -= 2;
}
}
}
}
|
cs |
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
|
static void Main(string[] args)
{
StreamWriter writer = new StreamWriter(OpenStandardOutput());
StreamReader reader = new StreamReader(OpenStandardInput());
string input = reader.ReadLine();
input = input.Replace("XXXX", "AAAA").Replace("XX", "BB"); // 모든 XXXX와 XX를 바꿔줍니다.
bool isSuccess = true;
for (int i = 0; i<input.Length; i++)
{
if (input[i] == 'X') // 하나라도 X가 있으면 실패
{
isSuccess = false;
break;
}
}
if (isSuccess)
writer.WriteLine(input);
else
writer.WriteLine(-1);
writer.Close();
reader.Close();
}
|
cs |
읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.
728x90
'[C#] 백준 (알고리즘) > 실버 문제' 카테고리의 다른 글
[백준 - C#] 2217번 로프 (0) | 2022.07.27 |
---|---|
[백준 - C#] 1931번 회의실 배정 (0) | 2022.07.27 |
[백준 - C#] 1439번 뒤집기 (0) | 2022.07.25 |
[백준 - C#] 1427 소트인사이드 (0) | 2022.07.20 |
[백준 - C#] 11047 동전 0 (0) | 2022.07.19 |