반응형
💻 Problem
"피터팬 프레임"은 단어를 다이아몬드 형태로 장식하는 것이다.
알파벳 X를 피터팬 프레임으로 장식하면 다음과 같다.
..#..
.#.#.
#.X.#
.#.#.
..#..
"웬디 프레임"은 피터팬 프레임과 유사하지만, 다이아몬드를 '*'로 만드는 것이다.
알파벳 X를 웬디 프레임으로 장식하면 다음과 같다.
..*..
.*.*.
*.X.*
.*.*.
..*..
단어가 주어졌을 때, 3의 배수 위치(세 번째, 여섯 번째, 아홉 번째, ...)에 있는 알파벳은 웬디 프레임으로, 나머지 알파벳은 피터팬 프레임으로 장식하는 프로그램을 작성하시오.
웬디 프레임과 피터팬 프레임이 겹칠 경우에는, 웬디 프레임이 위에 있다.
첫째 줄에 알파벳 대문자로 이루어진 최대 15글자 단어가 주어진다.
💡 Approach
입력의 길이가 최대 15이므로 배열의 크기는 세로 5, 가로 61이므로 구현 시간은 매우 여유롭다.
그냥 문자열을 직접 더해줘도 되지만 2차원 배열에 반복문으로 접근하는 방식으로 구현해보고 싶어서 오래 고민해 봤다.
decorate 함수 안에서 row, col을 지정할 때 자꾸 숫자나 범위가 헷갈려서 머리 아팠다..
문제에서 배열의 높이가 5이므로 가운데 행은 2번째 행이 된다.
- 2번째 행을 기준으로 2번째 행은 (2 - 2)번째 열, (2 + 2)번째 열에 장식
- 바로 위아래 행인 1번째 행, 3번째 행은 (2 - 1)번째 열, (2 + 1)번째 열에 장식
- 하나 더 위 아래 행인 0번째 행, 4번째 행은 (2 - 0)번째 열에 장식
피터팬 프레임('#')보다 웬디 프레임('*')이 우선이므로 특정 칸에 이미 웬디 프레임으로 장식되어 있다면 장식을 갱신하지 않았다.
✏️ Solution
import sys
input = sys.stdin.readline
def decorate(s, pattern):
for i in range(-mid, mid + 1):
if board[mid + i][s + abs(i)] != '*':
board[mid + i][s + abs(i)] = pattern
board[mid + i][s + N - 1 - abs(i)] = pattern
word = input().rstrip()
N = 5
mid = N // 2
board = [['.'] * (N + (N - 1) * (len(word) - 1)) for _ in range(N)]
for i in range(len(word)):
decorate(i * (N - 1), '*' if (i + 1) % 3 == 0 else '#')
for i in range(len(word)):
board[mid][i * (N - 1) + mid] = word[i]
for row in board:
print(*row, sep='')
반응형
'Algorithm > 백준 (BOJ)' 카테고리의 다른 글
[Python] 백준/BOJ 26042번: 식당 입구 대기 줄 (Silver 5) (0) | 2025.07.15 |
---|---|
[Python] 백준/BOJ 3459번: 아스키 도형 (Silver 1) (0) | 2025.07.14 |
[Python] 백준/BOJ 22869번: 징검다리 건너기 (small) (Silver 1) (0) | 2025.07.12 |
[Python] 백준/BOJ 14929번: 귀찮아 (SIB) (Silver 4) (0) | 2025.07.11 |