티스토리 뷰
반응형
🔷 🟩 1. 문제 설명
민식이는 아래와 같은 폴리오미노 조각을 가지고 있습니다:
AAAA
: 4개의 칸을 덮는 폴리오미노BB
: 2개의 칸을 덮는 폴리오미노
보드판에는 'X'
와 '.'
로 이루어진 문자열이 주어지고, 민식이는 모든 'X'를 이 폴리오미노 조각으로 빈틈 없이 덮고자 합니다. 단, '.'
는 절대로 덮으면 안 됩니다.
민식이의 목표는:
- 주어진 보드판에서 모든 'X'를 겹침 없이, 오직
AAAA
,BB
폴리오미노로만 덮는 것 - 덮는 것이 불가능하면
-1
을 출력 - 가능한 경우에는 사전순으로 가장 앞서는 결과를 출력
🔷 🟩 2. 문제 출처 및 링크
BOJ 1343번 - 폴리오미노
🔗 https://www.acmicpc.net/problem/1343
🔷 🟩 3. 나의 풀이 아이디어 및 접근 전략
🟨 핵심 아이디어 요약
'X'
가 연속으로 등장하는 덩어리 단위로 문제를 쪼갭니다.- 하나의 덩어리 안에서
'X'
의 개수(cnt
)를 세고, 그 개수를 바탕으로"AAAA"
와"BB"
로 나눠서 덮습니다. - 이때 반드시
'X'
의 개수는 짝수여야만 덮을 수 있습니다. - 이유:
AAAA
는 4개,BB
는 2개를 덮기 때문에 홀수는 덮을 수 없습니다.
🟨 구체적 처리 방식
- 입력 문자열을
list
로 받아 문자 하나하나 수정 가능하게 합니다. - 반복문을 돌며
'X'
가 나올 때마다 개수를 누적합니다. 'X'
가 끝나고'.'
가 나오거나 문자열이 끝나면, 지금까지 누적한'X'
의 개수를 바탕으로"AAAA"
와"BB"
로 교체합니다.- 이때:
- 홀수 개면 → 바로
-1
출력 - 4개 이상이면
"AAAA"
부터 최대한 채움 - 남는 2개는
"BB"
로 채움
- 홀수 개면 → 바로
- 실제로 리스트 내부 값을 바꾸기 위해
ptr
(포인터)을 이용하여 현재 교체 위치 추적
🟨 주요 변수 역할
🔷 🟩 4. 전체 코드 구현
st = list(input())
cnt = 0
ptr = 0
for i in range(len(st) + 1):
if i < len(st) and st[i] == 'X':
cnt += 1
else:
if cnt % 2 == 1:
print(-1)
exit()
elif cnt > 0:
while cnt >= 4:
for j in range(ptr, ptr + 4):
st[j] = 'A'
ptr += 4
cnt -= 4
while cnt >= 2:
for j in range(ptr, ptr + 2):
st[j] = 'B'
ptr += 2
cnt -= 2
ptr = i + 1
cnt = 0
for i in st:
print(i, end='')
🔷 🟩 5. 코드 라인별 세부 해설
🟨 입력 문자열을 리스트로 변환
st = list(input())
문자열을 리스트로 변환 → 이후에 직접 문자를 수정해야 하기 때문입니다.
🟨 초기 변수 선언
cnt = 0
ptr = 0
cnt
: 연속된 'X'의 개수를 저장ptr
: 교체할 시작 위치. 실제로"AAAA"
또는"BB"
를 어디에 넣을지 결정
🟨 전체 문자열 순회
for i in range(len(st) + 1):
+1
을 해주는 이유는 문자열 마지막에 'X'가 있을 경우도 처리해야 하기 때문입니다.
🟨 'X'가 연속되는 구간 처리
if i < len(st) and st[i] == 'X':
cnt += 1
현재 문자가 'X'
일 경우 cnt
를 1 증가시켜 연속된 'X' 개수를 세기 위함입니다.
🟨 'X' 덩어리 끝 처리: 홀수 불가 조건
else:
if cnt % 2 == 1:
print(-1)
exit()
지금까지 센 'X' 개수가 홀수면 덮을 수 없으므로 바로 종료합니다.
🟨 AAAA로 덮기
while cnt >= 4:
for j in range(ptr, ptr + 4):
st[j] = 'A'
ptr += 4
cnt -= 4
사전순을 만족하기 위해 "AAAA"
부터 최대한 채웁니다.
🟨 BB로 나머지 덮기
while cnt >= 2:
for j in range(ptr, ptr + 2):
st[j] = 'B'
ptr += 2
cnt -= 2
"AAAA"
로 못 채운 2개는 "BB"
로 채웁니다.
🟨 포인터, 카운터 초기화
ptr = i + 1
cnt = 0
다음 'X' 덩어리를 처리하기 위한 초기화입니다.
🟨 결과 출력
for i in st:
print(i, end='')
최종 결과 리스트를 다시 문자열처럼 출력합니다.
🔷 🟩 6. 개선된 코드 (시간/공간 복잡도 최적화 방향)
🟨 개선 이유
- 리스트 내부를 직접 수정함 →
ptr
,for j
반복문으로 복잡함 - 불필요한 변수와 반복문 중첩
- 가독성이 떨어짐
🟨 개선 코드 전체
board = input()
result = ''
i = 0
while i < len(board):
if board[i] == 'X':
count = 0
while i < len(board) and board[i] == 'X':
count += 1
i += 1
if count % 2 == 1:
print(-1)
exit()
result += 'AAAA' * (count // 4)
result += 'BB' * ((count % 4) // 2)
else:
result += '.'
i += 1
print(result)
🔷 🟩 7. 개선 코드 라인별 상세 해설
🟨 입력 처리 및 결과 저장 초기화
board = input()
result = ''
i = 0
문자열을 그대로 받고, 결과는 result
라는 문자열에 누적합니다.
🟨 문자열 전체 순회
while i < len(board):
인덱스를 직접 제어하며 전체 문자열을 순회합니다.
🟨 'X' 덩어리 개수 세기
if board[i] == 'X':
count = 0
while i < len(board) and board[i] == 'X':
count += 1
i += 1
연속된 'X'
가 몇 개인지 카운트하며 i
도 동시에 증가시켜 다음 위치로 이동합니다.
🟨 홀수 불가능 조건
if count % 2 == 1:
print(-1)
exit()
'X'
개수가 홀수라면 덮을 수 없기 때문에 종료합니다.
🟨 AAAA, BB 덮기 처리
result += 'AAAA' * (count // 4)
result += 'BB' * ((count % 4) // 2)
4개씩 AAAA
로 최대한 덮고, 남는 2개는 BB
로 덮습니다.
🟨 '.' 처리
else:
result += '.'
i += 1
'.'
은 그대로 유지해야 하므로 결과에 그대로 추가합니다.
🟨 최종 출력
print(result)
덮은 결과 전체를 출력합니다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 7568번 덩치 문제 C++ (0) | 2025.06.06 |
---|---|
백준 7568번 덩치 문제 풀이 Python (1) | 2025.06.06 |
🧾 문제 설명 (BOJ 14916번: 거스름돈) 파이썬 (2) | 2025.06.05 |
[BOJ 1343] 폴리오미노 C++ 풀이 (0) | 2025.06.05 |
🪙 BOJ 14916번: 거스름돈 – 최소 동전 개수 구하기 C++ (1) | 2025.06.02 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Python
- 브루트포스
- python 알고리즘
- 파이썬
- 파이썬코딩
- C++ 알고리즘
- 인접 행렬
- 코딩테스트
- 문자열처리
- 그리디알고리즘
- 동적 계획법
- DP
- dfs
- c++알고리즘
- C++
- 코딩
- 알고리즘 문제풀이
- 알고리즘기초
- 문제 풀이
- 백준
- 코딩 테스트
- 알고리즘
- 알고리즘문제풀이
- 그래프 탐색
- 동적계획법
- 문제풀이
- 객체지향
- 그리디
- c언어
- 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형