본문 바로가기
개발/알고리즘

별 찍기

by ny0011 2021. 1. 28.
반응형

ryute.tistory.com/39?category=735345

ryute.tistory.com/33?category=735345

알고리즘 너무 안했더니 노답 코더가 되는 거 같아 처음부터 시작해보기로 했다

 

www.acmicpc.net/problem/2442

 

2442번: 별 찍기 - 5

첫째 줄에는 별 1개, 둘째 줄에는 별 3개, ..., N번째 줄에는 별 2×N-1개를 찍는 문제 별은 가운데를 기준으로 대칭이어야 한다.

www.acmicpc.net

사실 별만 찍는게 아니라 별 앞에 space bar도 찍는다

n개가 input일 때 거꾸로 밑에서부터 위로 올라가면 아래 표 처럼 출력하면 된다

*번째 행 spacebar
n 0 2n-1
n-1 1 2(n-1)-1
n-2 2 2(n-2)-1
n-k k 2(n-k)-1
1 n-1 1
n = int(input())

for i in range(1,n+1):
    spacebar = " "*(n-i)
    star = "*"*(2*i-1)
    print(spacebar+star)

 

www.acmicpc.net/problem/2445

 

2445번: 별 찍기 - 8

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

2445번은 별과 별 사이에 spacebar를 찍는 문제다

*번째 행 spacebar
1 1 2(n-1) 1
n-k n-k 2k n-k
n n 0 n
n+k n-k 2(n-k) n-k
2n-1 1 2(n-1)  1
n = int(input())

for i in range(1,n):
    spacebar = " "*2*(n-i)
    star = "*"*i
    print(star+spacebar+star)
    
print("*"*2*n)

for i in range(n-1,0,-1):
    spacebar = " "*2*(n-i)
    star = "*"*i
    print(star+spacebar+star)

 

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

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

오... 쪼오금 어려워졌다.

홀수/짝수 번 째 줄일 때로 나누고 각 줄에서는 prefix/mid/postpix로 나누어보았다.

prefix = "* ", mid=" " if 짝수 번 째 줄 else "*", postfix=" *"

-> 막상 따져보니 홀수/짝수는 mid만 다르고 패턴은 똑같음!

 

n=3일 때 홀수번째 행만 생각

*번째 행 prefix "* " 개수 mid 개수 postfix " *" 개수
1 0 9 = 4*(3-0-1)+1 0
3 1 5 = 4*(3-1-1)+1 1
5 2 1 = 4*(3-2-1)+1 2
7 1 5 = 4*(3-1-1)+1 1
9 0 9 = 4*(3-0-1)+1 0
i (조건: i<2n) i/2 4*(3-i/2-1)+1 i/2

가운데를 기준으로 대칭임. 

가운데를 제외하고 i번째 행일 때 mid개수는 4*(n-i/2)+1임을 알 수 있음

q= i를 2로 나눈 몫, r = i를 2로 나눈 나머지로 했을 때 

q는 별과 spacebar를 찍는 개수, r은 홀수/짝수를 나누는 기준으로 사용하면 됨

import sys
n = int(input())

if n == 1:
    print("*")
    sys.exit()

def play(i):
    spacebar = prefix = postfix= ""
    q , r = i//2, i%2
    prefix,  postfix= "* "*q, " *"*q
    mid = " "*(4*(n-1-q)+1) if r == 0 else "*"*(4*(n-1-q)+1)
    print(prefix+mid+postfix)
    
for i in range(1,2*n-1):
    play(i)

print("* "*(2*n-1))

for i in range(2*n-2,0,-1):
    play(i)

 

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

 

2448번: 별 찍기 - 11

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

www.acmicpc.net

 

 

'개발 > 알고리즘' 카테고리의 다른 글

알고리즘 관련 사이트 & 책  (0) 2021.02.01
코드 구현하기  (0) 2021.01.29
Squares of a Sorted Array  (0) 2021.01.23
Find Numbers with Even Number of Digits  (0) 2021.01.22
485. Max Consecutive Ones  (0) 2021.01.22

댓글