[백준/파이썬] 3054번: 피터팬 프레임

수박강아지·2025년 5월 6일

BAEKJOON

목록 보기
67/174

문제

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

풀이

"피터팬 프레임"은 단어를 다이아몬드 형태로 장식하는 것이다.
알파벳 X를 피터팬 프레임으로 장식하면 다음과 같다.

..#..
.#.#.
#.X.#
.#.#.
..#..

"웬디 프레임"은 피터팬 프레임과 유사하지만, 다이아몬드를 *로 만드는 것이다.
알파벳 X를 웬디 프레임으로 장식하면 다음과 같다.

..*..
.*.*.
*.X.*
.*.*.
..*..
  • 단어가 주어졌을 때, 3의 배수 위치에는 웬디 프레임으로 나머지는 피터팬 프레임으로 출력

구현은 생각보다 빨리 했는데, 웬디 프레임 출력할 때 상당히 애 좀 먹었습니다..

프레임은 항상 5줄로 이루어져있기 때문에 이를 이용해서 풀어보겠습니다.
빈 문자열 5개를 저장한 리스트를 선언해 여기다 그림을 그려볼게요.

enumerate()를 이용해 인덱스와 값을 모두 가져와 보겠습니다.

frame = [''] * 5

for i,c in enumerate(s):

예시를 보면 알겠지만 패턴이 항상 일정하기 때문에 이를 먼저 그려보겠습니다.

    val = '#'

    if (i+1) % 3 == 0: # 3의 배수일 경우
        val = '*'
        
    pattern = [
        f'..{val}..',
        f'.{val}.{val}.',
        f'{val}.{c}.{val}',
        f'.{val}.{val}.',
        f'..{val}..'
    ]

생각보다 단순하죠?
이제 이 값들을 배열에 추가해주면 됩니다.

    for idx in range(5):
        if i == 0: # 첫 번째 그림일 경우
            frame[idx] = pattern[idx] # 값을 그대로 추가
        else: # 1 이상일 경우
            frame[idx] += pattern[idx][1:] # 첫 번째 값을 제외하고 추가

이렇게 해주면 끝 ‼️
인줄 알았으나 ,, 이 상태로 한 번 예제 abcd를 입력해보겠습니다.

c의 옆 부분을 보시면 *이 출력이 돼야 하는데, #이 나오는 것을 확인하실 수 있습니다.

이를 어떻게 해결할지 상당히 고민을 많이 했는데, 구글링하다가 다른 분의 코드를 보고 참고해서 해결했습니다..

인덱스가 3의 배수일 경우 val 값만 수정한 것이 아니라 바로 3번째 줄을 수정해주었습니다.

마지막 값을 삭제하고 그 뒤에 *을 추가해 이를 해결했습니다. 🥳

    if (i+1) % 3 == 0:
        val = '*'
        frame[2] = frame[2][:-1]+val

실버라고 만만히 봤다가 큰 코 다친 문제 ,,

코드

s = input()
frame = [''] * 5

for i,c in enumerate(s):
    val = '#'

    if (i+1) % 3 == 0:
        val = '*'
        frame[2] = frame[2][:-1]+val
                
    pattern = [
        f'..{val}..',
        f'.{val}.{val}.',
        f'{val}.{c}.{val}',
        f'.{val}.{val}.',
        f'..{val}..'
    ]
    
    for idx in range(5):
        if i == 0:
            frame[idx] += pattern[idx]
        else:
            frame[idx] += pattern[idx][1:]
            
for row in frame:
    print(row)

0개의 댓글