boj-2447(별 찍기)

11609 단어 백준bojboj

꽤 오랫동안 해결하지 못하고 있던 문제.. 코드는 잘 실행되고, 문제는 하나도 없어보였는데 뭐지.. 계속 시간초과가 난다 그래서 포기하고 있다가 다시 오랜만에 들어가서 확인해보니까, pypy로 돌려본적이 없네?
그래서 전에 시간초과가 난 코드 그대로 pypy로 돌리니까 맞았습니다가 나와버림... ㅋ
어이가 없는데 정말... 시간초과 나면 pypy로 돌려보세요...

클래스가 좀 있는 문제라서, 고민을 꽤 했다.
분류대로 재귀함수로 풀고싶어서, 고민을 오래 한것 같다.
옛날에 풀다가, 마지막에 작성한 코드도 뭔가 갑자기 번뜩! 하면서 미친듯이 작성해서 코드 해설은 못하겠다. 이전 코드와 마지막에 패스한 코드를 따로 올려놓아볼테니.. 둘 다 확인해보면 좋을 것 같다.

이전 코드

import sys

n = int(input())
a = [['*'] * n for i in range(n)]

def star_print(n, list, origin_size):
    origin = origin_size
    if n < 3:
        return list
    for i in range(origin):
        for j in range(origin):
            if j // (n // 3) == 1 and i // (n // 3) == 1: # n = 27 / n // 3 = 9  -> n = 9 / n // 3 = 3          
                for t in range(origin):
                    for p in range(origin):
                        if i + n*t < origin and j + n*p < origin:
                            list[i + n*t][j + n*p] = " "
    return star_print(n // 3, list, origin)
pr = star_print(n, a, n)

for i in range(len(pr)):
    for j in range(len(pr[0])):
        sys.stdout.write(pr[i][j])
    sys.stdout.write("\n")

패스 코드

import sys
def print_star(star, N, origin_size):
    if N < 3:
        return star
    else:    
        for i in range(origin_size):
            for j in range(origin_size):
                if (i // (N//3)) % 3 == 1 and (j // (N//3)) % 3 == 1:
                    star[i][j] = ' '
        return print_star(star, N//3, origin_size)

N = int(input())
star_list = [['*'] * N for i in range(N)]

star = print_star(star_list, N, N)
for i in range(N):
    for j in range(N):
        sys.stdout.write(star[i][j])
    sys.stdout.write("\n")

마지막 코드를 짤 땐, 진짜 누가 뒤통수를 콱 때린거마냥 갑자기 코드를 막 수정했는데, 잘 돌아가서 신기했다. 확실히 코드가 많이 짧아지고, 잘 돌아가서 흥미로웠던 문제였다.

좋은 웹페이지 즐겨찾기