Algorithm (Python, Java, SQL)/BaekJoon

[백준 1343번] 폴리오미노 (Python) (함수 replace로 특정 문자열 바꾸기)

sanadoing_ 2023. 6. 20. 11:14
728x90

> Python, 구현, 그리디 알고리즘

 

 

 

 

 

 

 

 

📖 문제 : 폴리오미노 (Python)

 

민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB

이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는 겹침없이 'X'를 모두 폴리오미노로 덮으려고 한다. 이때, '.'는 폴리오미노로 덮으면 안 된다. 폴리오미노로 모두 덮은 보드판을 출력하는 프로그램을 작성하시오.

 

 

 

입력

첫째 줄에 보드판이 주어진다. 보드판의 크기는 최대 50이다.

 

 

출력

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

 

 

 

예제 입력 1

XXXXXX

예제 출력 1

AAAABB

예제 입력 2

XX.XX

예제 출력 2

BB.BB

예제 입력 3

XXXX....XXX.....XX

예제 출력 3

-1

예제 입력 4

X

예제 출력 4

-1

예제 입력 5

XX.XXXXXXXXXX..XXXXXXXX...XXXXXX

예제 출력 5

BB.AAAAAAAABB..AAAAAAAA...AAAABB

 

 

 

내 코드

if __name__ == "__main__":
    str1 = input()
    str2 = list(map(str, str1.split('.')))
    str3 = list(map(str, str1.split('X')))

    temp = ''
    answer = ''

    str_x = []
    str_dot = []

    idx_x = 0
    idx_dot = 0

    for w in range(len(str2)):  # str_x 리스트에 X로 구성된 문자열만 저장
        if str2[w] != '':
            str_x.append(str2[w])

    for q in range(len(str3)):  # str_dot 리스트에 .로 구성된 문자열만 저장
        if str3[q] != '':
            str_dot.append(str3[q])

    for i in range(len(str_x)):
        if int(len(str_x[i]) % 2) != 0:     # X의 수가 홀수개면 AAAA 또는 BB 로 덮을 수 없기에 -1 출력
            print(-1)
            break
        elif int(len(str_x[i]) % 4) == 0:      # X의 수가 4로 나눈 나머지가 0, AAAA 로만 덮을 수 있는 경우
            for _ in range(int(len(str_x[i]) / 4)):
                temp += 'AAAA'

        else:
            if int(len(str_x[i]) / 4) >= 1:      # X의 수가 4로 나눈 나머지가 0보다 크면 , AAAA와 BB로 덮을 수 있는 경우
                for _ in range(int(len(str_x[i]) / 4)):     # AAAA로 먼저 덮은 후
                    temp += "AAAA"

                for _ in range(int(len(str_x[i]) % 4 / 2)):     # BB로 덮기 
                    temp += "BB"
            else:
                for _ in range(int(len(str_x[i]) / 2)):      # X의 수가 4로 나눈 나머지가 0보다 작으면 , BB로만 덮을 수 있는 경우
                    temp += "BB"
        str_x[i] = temp
        temp = ''
    else:
        if str1[0] == '.':      # 주어진 문자열의 첫 문자가 .으로 이루어 졌을 경우 
            for i in range(1, len(str_x) + len(str_dot) + 1):
                if int(i % 2) != 0:
                    answer += str_dot[idx_dot]
                    idx_dot += 1
                else:
                    answer += str_x[idx_x]
                    idx_x += 1
        else:      # 주어진 문자열의 첫 문자가 X으로 이루어 졌을 경우 
            for i in range(1, len(str_x) + len(str_dot) + 1):
                if int(i % 2) == 0:
                    answer += str_dot[idx_dot]
                    idx_dot += 1
                else:
                    answer += str_x[idx_x]
                    idx_x += 1

        print(answer)

 

 

Point ! ⭐️ 

  • 제가 짠 코드는 너무 길고 충분히 주석으로 이해하실 거라고 생각합니다.
    5줄로 이루어진 멋진 코드가 있더라구요. 참고하세요

 

 

 

 

 

정말 멋진 코드 ! 👏🏻

board = input()

board = board.replace("XXXX", "AAAA")
board = board.replace("XX", "BB")

if 'X' in board:
    print(-1)
    
else:
    print(board)

레전드네요 . . 👏🏻

 

 

 

 

 

 

 

 

 

백준

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

 

1343번: 폴리오미노

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

www.acmicpc.net

참고 

https://s0ng.tistory.com/entry/%EB%B0%B1%EC%A4%80-%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%8F%B4%EB%A6%AC%EC%98%A4%EB%AF%B8%EB%85%B8-1343%EB%B2%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC-python

 

[백준] 그리디 알고리즘 - 폴리오미노 (1343번) #파이썬 #python

폴리오미노 (1343번) 시간 제한 : 2초 메모리 제한 : 128 MB 문제 민식이는 다음과 같은 폴리오미노 2개를 무한개만큼 가지고 있다. AAAA와 BB 이제 '.'와 'X'로 이루어진 보드판이 주어졌을 때, 민식이는

s0ng.tistory.com

 

728x90