상세 컨텐츠

본문 제목

백준 #1343 - 폴리오미노

C#/알고리즘

by McRobbin 2020. 5. 30. 15:05

본문

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

 

1343번: 폴리오미노

첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.

www.acmicpc.net

그리디 알고리즘으로 분류된 1343번 폴리오미노 입니다.

 

요새 게임 만드는거 공부한다고 알고리즘에 소홀했습니다.

알고리즘 스터디 하고있는데 문제 한번 잘못냈다가 고생을해서 쉬운 문제로 고르다보니

간만에 해도 재밌네요 ㅎㅎ 잡소리는 여기까지 하고 설명 가겠습니다.

 

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1343
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine().Replace('X''A');
            var strList = new List<string>();
 
            int index = 0;
            int targetIndex = 0;
 
            while(index < input.Length && targetIndex < input.Length)
            {
                if (input[index] == input[targetIndex])
                    targetIndex++;
                else
                {
                    strList.Add(input.Substring(index, targetIndex - index));
                    index = targetIndex;
                }
            }
            strList.Add(input.Substring(index, targetIndex - index));
 
            if (strList.Find(x => x.Length % 2 != 0 && x.StartsWith("A")) != null)
                Console.WriteLine("-1");
 
            else
            {
                strList.ForEach(x =>
                {
                    if (x.StartsWith(".")) Console.Write(x);
                    else if (x.Length % 4 == 0Console.Write(x);
                    else Console.Write(x.Substring(0, x.Length - 2+ "BB");
                });
            }
        }
    }
}
 
 
cs

바로 예시로 가는게 나을거 같습니다.

 

폴리오미노 : AAAA , BB

 

ex) XXXX....XXXXXX....XX...

문제 입력이 이런식으로 주어지는데요 간단하게 설명하자면 저 X들을 AAAA, BB로 채우면 되겠습니다.

다만 X가 4개있으면 AAAA 또는 BBBB 이런식으로 채울수 있는데 사전순으로 앞으로 오게 채우면 되겠습니다.

 

즉 AAAA를 먼저 채워주고 남는칸에 BB를 채워주면 됩니다.

 

먼저 입력받은 문자열의 X를 전부 A로 바꿔줬습니다. => Replace

그럼 AAAA....AAAAAA....AA... 이런 식으로 나옵니다. ('.'의 갯수는 별로 관심이 없기에 대충 적었습니다.)

 

다음 저 문자열을 A의 덩어리와 .의 덩어리로 나눠 리스트에 넣었습니다.

AAAA, ..... AAAAAA, ......, AA, ...

 

다음 A로 시작하는 문자열을 전부 보는데 폴리오미노 길이가 4또는 2니까 길이가 2로나눈 나머지가

0이 아닌 것들은 폴리오미노로 채워질수 없습니다. 예외처리 해줍시다.

 

다음 4로 나눠봐서 나머지가 0이라면 모두 A로 채워지고 나머지가 있다면 B를 써서 채워야 한다는

얘기가 되겠습니다.

 

Length % 4 ==0 인것과 아닌것으로 나눠서 BB를 붙여주고 출력해줬습니다.

'C# > 알고리즘' 카테고리의 다른 글

백준# 10845 - 큐  (0) 2020.06.21
백준 #2504 - 괄호의 값  (0) 2020.06.13
백준# 2870 - 수학숙제  (0) 2020.05.22
백준# 9996 - 한국이 그리울 땐 서버에 접속하지  (0) 2020.05.16
백준# 9933 - 민균이의 비밀번호  (0) 2020.05.15

관련글 더보기