Algorithm
Baekjoon 백준 알고리즘 - 폴리오미노 ( 1343 )
jssvs
2022. 2. 27. 18:46
반응형
1. 문제 소개
- 그리디 유형 문제에 해당한다.
https://www.acmicpc.net/problem/1343
2.코드
# 1. valid_check
# - 폴리오미노 유효성 검사
# - x 가 짝수개수인지 체크
# 2. custom_split
# - X와 . 을 분리
# 3. convert
# - AAAA , BB 우선순위로 폴리오미노 문자 조합
def set_test_case():
T = input()
return T
def valid_check(s):
result = True
for case in s.split('.'):
case_len = len(case)
if case_len %2 != 0:
result = False
return result
return result
def custom_split(input_str):
split_list = []
last_dot_point=-1
cursor = 0
while (cursor < len(input_str)):
# 첫번째 문자가 닷(.) 이 아닌 경우 , 연속적인 닷(.)이 아닌경우
if input_str[cursor] == '.':
if cursor > 0 and not (input_str[cursor-1] == '.'):
split_list.append(input_str[last_dot_point+1:cursor])
last_dot_point = cursor
else:
last_dot_point = cursor
split_list.append('.')
# 마지막 커서 도달 시 잔여 문자 처리
if cursor == len(input_str)-1 and cursor != last_dot_point:
split_list.append(input_str[last_dot_point+1:])
cursor +=1
return split_list
def convert(split_list):
result =''
for case in split_list:
if case[0] =='X':
cursor = 0
while(cursor < len(case)):
if len(case[cursor:]) >= 4:
result +='AAAA'
cursor +=4
else:
result +='BB'
cursor+=2
else:
result+=case
return result
def solution():
#s = '...'
# s = '..XXXX..XX.'
# s= 'XX.XXXXXXXXXX..XXXXXXXX...XXXXXX'
s = set_test_case()
split_str = custom_split(s)
if not valid_check(s):
result = '-1'
else:
result = convert(split_str)
print(result)
if __name__=='__main__':
solution()
3. 코멘트
- custom_split() 에서는 입력 문자열의 문자를 하나 하나 순회하면서, 닷(.) 과 X를 분리하고, convert() 에서는 사전 순 ordering을 위해 AAAA, BB 순서로 문자를 치환하는 방식이다.
- 최근에 이직한 새 회사에 적응하느라 스터디를 많이 못하기도 했고.. 뇌가 굳은건지.. 간단한 로직이라 생각했는데 구현이 빨리 빨리 안되서 속상하다.
- 스터디 새 멤버도 충원됐고, 앞으로 꾸준히 공부해야겠다. :D
반응형