문제
1343번: 폴리오미노
첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다.
www.acmicpc.net
풀이
본 문제는 그리디를 사용해서 풀이했습니다.
폴리오미노 'AAAA'의 문자 개수가 폴리오미노 'BB'의 문자 개수의 배수이기 때문에
'AAAA' 선택 후 'BB' 선택이라는 현재 시점에서의 최선의 선택지가 있기 때문입니다.
연속된 'X' 와 '.' 에 대해 다른 태도를 취해야하므로 ('X' 는 교체, '.' 는 통과) 'X' 와 '.' 을 나눠서 새로운 배열에 저장해 주었는데,
문자열을 나눠서 새로운 배열 answer_lst 에 넣어주는 과정은 divide_board 함수를 이용했습니다.
divide_board 함수 내용은 다음과 같습니다.
- 인덱스 슬라이싱을 위한 시작 포인트를 지정하기 위한 point 변수
- 한 문자로만 이루어진 문자열을 저장하기 위한 answer_lst
- 입력받은 board 문자열을 0 번째 인덱스부터 (len(board) - 2) 번째 인덱스까지 살펴봅니다.
- 현재 보고 있는 문자와 다음 문자를 비교해서 다르면, 시작 point 부터 현재 인덱스 i 까지 슬라이싱해 배열에 추가합니다.
- 시작 point 는 현재 인덱스의 다음 인덱스로 초기화 해줍니다.
- (len(board) - 2) 번째 인덱스 (현재 i == len(board) - 2) 까지 살펴봤으면 현재 시작 point 부터 문자열 끝까지 (i + 1번째) 슬라이싱해 배열에 추가해줍니다.
'X' 로 이루어진 문자열의 경우는 'X' 의 개수가 홀수일 때만 덮을 수 없으므로 이에 대한 분기처리를 해주었습니다.
💡 풀이 코드는 아래와 같습니다.
input_board = input()
# 입력 -> 'XX.XX'
# 출력 -> ['XX', '.', 'XX']
def divide_board(board):
point = 0
answer_lst = []
# 다음 인덱스가 없을 경우(문자열 board 길이가 1)의 예외처리
if len(board) == 1:
return [board]
for i in range(len(board) - 1):
if board[i] == board[i + 1]:
continue
elif board[i] != board[i + 1]:
answer_lst.append(board[point:i + 1])
point = i + 1
answer_lst.append(board[point:i + 2])
return answer_lst
def solution(board):
result_lst = []
for target in divide_board(board):
# 문자 '.'일 경우 그대로 추가
if target[0] == '.':
result_lst.append(target)
# 문자 'X'일 경우 치환해서 추가
else:
num = len(target)
# 치환 불가일 경우
if num % 2 == 1:
return -1
else:
result_lst.append('A' * (num // 4) * 4 + 'B' * (num % 4))
return ''.join(result_lst)
print(solution(input_board))
... 리팩토링 과정에서 replace 함수를 이용해 더 간편하게 풀 수 있다는 것을 깨달았습니다.
board = input()
# 'AAAA'로 먼저 치환
board = board.replace('XXXX', 'AAAA')
board = board.replace('XX', 'BB')
print(-1) if 'X' in board else print(board)
'Algorithm' 카테고리의 다른 글
[프로그래머스] 성격 유형 검사하기 (KAKAO TECH INTERNSHIP) - Python (0) | 2023.02.23 |
---|---|
[프로그래머스] 실패율 (KAKAO BLIND RECRUITMENT) - Python (0) | 2023.02.23 |
[프로그래머스] 다트 게임 (KAKAO BLIND RECRUITMENT) - Python (0) | 2023.02.22 |
[프로그래머스] 체육복 - Python (0) | 2022.12.04 |
[프로그래머스] 구명보트 - Python (0) | 2022.12.04 |