[백준] 1343 폴리오미노 (replace 사용하지 않고 구현하기)

TaeSun·2023년 6월 28일
0

구현

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

코드

import sys
sys = stdin.readline
string = list(map(str, input().strip())
# 검사할 문자 변수 & 새로운 문자열 변수

s = "
new = ""
flag = True
for i in string:
	if i == ".":
		new += "AAAA" * int(len(s) // 4)
		s = s[len(s) // 4 * 4:]
		if len(s) % 2 == 0:
			new += "BB" * int(len(s) // 2)
		else:
			print("-1")
			s = ""
			flag = False
			break
		s = ""
		new += "."
	else:
		s += i

if s != "":
	new += "AAAA" * int(len(s) // 4)	
	s = s[len(s)//4 * 4:]
	if len(s) % 2 == 0:
		new += "BB" * int(len(s) // 2)
	else:
		print("-1")
		flag = False
if flag:
	print(new)

설명

  1. AAAA를 우선적으로 채워야 한다는 것.
    예제에서 보면 XXXXXX는 가장 길이가 긴 문자열인 AAAA를 먼저 채우고 있고
    그 이후에 BB를 사용해서 채워나가고 있다. 따라서 AAAA를 채우고 그 이후에 남은 문자열에 대해서 검사한다는 것을 이해해야 한다.
  2. AAAA를 채운만큼 "문자가 채워졌기 때문에 남은 문자 길이에 대해서 B로 채울 수 있는지에 대한 여부가 중요하다" 따라서 A로 채우고나서 B로 채울 수 있는 경우는 "채워진 문자열이 2로 나누어 떨어지는지가 중요하다 그래야 BB를 채울 수 있기 때문이다." 만약 채울 수 없다면 BB를 활용하지 못한다는 얘기가 되고 그렇다는건 문제에서 만들고자 하는 폴리오미노를 만들 수 없다. 그렇기 때문에 flag 변수를 설정해서 정상적인 폴리오미노를 만들었을때(true일때) 메세지가 중복되서 출력되지 않도록 한다.
  3. 다음 문자열을 받기 위해서 s를 항상 초기화 시켜주어야 한다 문자열을 받는 기준을 나는 "."이 들어오는 순간으로 잡았기 때문이다. 따라서 "."들어오기 전까지의 "X" 문자열을 검사하고 새로운 리스트로 만들어주었기 때문에 다른 문자열을 검사하기 위해 초기화를 시켜주어야 한다.
  4. 모든 for문을 순회했을때 마지막 문자열은 그대로 남아있게 된다. 따라서 마지막 문자열이 남아있다면 그것까지도 바꾸어 주어야하기 때문에 마지막 문자에 대한 내용을 따로 구현함으로써 폴리오미노를 완성할 수 있다.

Thank you

많은 분들이 python replace함수를 사용해서 풀었기 때문에 분명 효율적일 수 있습니다. 이 코드의 목적은 replace를 사용하지 않고 구현해보는 것이며 논리적 사고력을 향상시키는데 목적이 있습니다

profile
Good things take times

0개의 댓글