기록

백준_2448_별 찍기 - 11 본문

코딩테스트/python

백준_2448_별 찍기 - 11

youngyin 2020. 12. 30. 18:20

문제

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

풀이

" "를 "/"를 바꾸어 표현하면 아래와 같으며, 다음과 같은 패턴을 찾을 수 있다.

04: *(01)사이에 5개의 /가 들어가 있다. ****(03)의 길이는 5이다.

05: */*(02)사이에 3개의 /가 들어가 있다. */*(02)의 길이는 3이다.

06: ****(03)사이에 1개의 /가 들어가 있다. *(01)의 길이는 1이다.

 

07: *(01)사이에 11개의 /가 들어가 있다. *****/*****(06)의 길이는 11이다.

08: */* (02)사이에 9개의 /가 들어가 있다. */*///*/* (05)의 길이는 9이다.

09: ***** (03)사이에 7개의 /가 들어가 있다. */////* (04)의 길이는 7이다.

10: */////* (04)사이에 5개의 /가 들어가 있다. ****(03)의 길이는 5이다.

11: */*///*/* (05)사이에 3개의 /가 들어가 있다. */*(02)의 길이는 3이다.

12: *****/*****(06)사이에 1개의 /가 들어가 있다. *(01)의 길이는 1이다.

 

13: *(01)사이에 23개의 /가 들어가 있다. *****/*****/*****/*****(12)의 길이는 23이다.

14: */*(02)사이에 21개의 /가 들어가 있다. */*///*/*///*/*///*/*(11)의 길이는 21이다.

15: *****(03)사이에 19개의 /가 들어가 있다. */////*/////*/////*(10)의 길이는 19이다.

16: */////*(04)사이에 17개의 /가 들어가 있다. *****///////*****(09)의 길이는 17이다.

17: */*///*/*(05)사이에 15개의 /가 들어가 있다. */*/////////*/*(08)의 길이는 15이다.

18: *****/*****(06)사이에 13개의 /가 들어가 있다. *///////////*(07)의 길이는 13이다.

19: *///////////*(07)사이에 11개의 /가 들어가 있다. *****/*****(06)의 길이는 11이다.

20: */*/////////*/*(08)사이에 9개의 /가 들어가 있다. */*///*/* (05)의 길이는 9이다.

21: *****///////*****(09)사이에 7개의 /가 들어가 있다. */////* (04)의 길이는 7이다.

22: */////*/////*/////*(10)사이에 5개의 /가 들어가 있다. ****(03)의 길이는 5이다.

23: */*///*/*///*/*///*/*(11)사이에 3개의 /가 들어가 있다. */*(02)의 길이는 3이다.

24: *****/*****/*****/*****(12)사이에 1개의 /가 들어가 있다. *(01)의 길이는 1이다.

01: ///////////////////////*///////////////////////
02: //////////////////////*/*//////////////////////
03: /////////////////////*****/////////////////////
04: ////////////////////*/////*////////////////////
05: ///////////////////*/*///*/*///////////////////
06: //////////////////*****/*****//////////////////
07: /////////////////*///////////*/////////////////
08: ////////////////*/*/////////*/*////////////////
09: ///////////////*****///////*****///////////////
10: //////////////*/////*/////*/////*//////////////
11: /////////////*/*///*/*///*/*///*/*/////////////
12: ////////////*****/*****/*****/*****////////////
13: ///////////*///////////////////////*///////////
14: //////////*/*/////////////////////*/*//////////
15: /////////*****///////////////////*****/////////
16: ////////*/////*/////////////////*/////*////////
17: ///////*/*///*/*///////////////*/*///*/*///////
18: //////*****/*****/////////////*****/*****//////
19: /////*///////////*///////////*///////////*/////
20: ////*/*/////////*/*/////////*/*/////////*/*////
21: ///*****///////*****///////*****///////*****///
22: //*/////*/////*/////*/////*/////*/////*/////*//
23: /*/*///*/*///*/*///*/*///*/*///*/*///*/*///*/*/
24: *****/*****/*****/*****/*****/*****/*****/*****

코드

height = int(input())
width = int((height/3)*5 + (height/3-1))
board = [[" " for i in range(width)] for i in range(height)]
patterns = ["*", "* *", "*****"]

def drawCenter(board, pattern, r) :
    edge = (width - len(pattern)) / 2
    for j in range(len(pattern)):
        try :
            board[r][int(edge) + j] = pattern[j]
        except :
            return 0

# draw init pattern
size = len(patterns)
for i in range(size) :
    drawCenter(board, patterns[i], i)

while True:
    size = len(patterns)
    for i in range(size) :
        pattern = "{0:s}{1:s}{0:s}".format(patterns[i], " "*len(patterns[size-i-1]))
        patterns.append(pattern)
        ans = drawCenter(board, pattern, i+size)
    if ans==0 : break

# print board
for i in range(height) :
    print("".join(board[i]))

'코딩테스트 > python' 카테고리의 다른 글

백준_9465_스티커  (0) 2021.01.02
백준_12852_1로 만들기 2  (0) 2020.12.31
백준_17070_파이프 옮기기 1  (0) 2020.12.30
백준_1085_직사각형에서 탈출  (0) 2020.12.28
백준_1259_팰린드롬수  (0) 2020.12.28
Comments