파이썬 별찍기 원리 - paisseon byeoljjiggi wonli

1. 백준 2438번 별 찍기1 파이썬

www.acmicpc.net/problem/2438

 

2438번: 별 찍기 - 1

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
for i in range(int(input())):
    print("*"*(i+1))

 

 

2. 백준 2439번 별찍기2 파이썬

www.acmicpc.net/problem/2439

 

2439번: 별 찍기 - 2

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())
for i in range(1, n+1):
    print(" "*(n-i)+"*"*i)

 

 

3. 백준 2440번 별찍기3 파이썬

www.acmicpc.net/problem/2440

 

2440번: 별 찍기 - 3

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())

for i in range(n,0,-1):
    print("*"*i)

 

 

4. 백준 2441번 별찍기4 파이썬

www.acmicpc.net/problem/2441

 

2441번: 별 찍기 - 4

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())

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

 

 

5. 백준 2442번 별찍기5 파이썬

www.acmicpc.net/problem/2442

 

2442번: 별 찍기 - 5

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

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())

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

 

 

6. 백준 2443번 별찍기6 파이썬

www.acmicpc.net/problem/2443

 

2443번: 별 찍기 - 6

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

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())
for i in range(n,0,-1):
    print(" "*(n-i)+"*"*(i*2-1))

 

 

7. 백준 2444번 별찍기7 파이썬

www.acmicpc.net/problem/2444

 

2444번: 별 찍기 - 7

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

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())

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

 

8. 백준 2445번 별찍기8 파이썬

www.acmicpc.net/problem/2445

 

2445번: 별 찍기 - 8

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

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())

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

 

 

9. 백준 2446번 별찍기9 파이썬

www.acmicpc.net/problem/2446

 

2446번: 별 찍기 - 9

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

www.acmicpc.net

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
n = int(input())

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

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

공유하기

게시글 관리

구독하기쏭쓰 블로그

저작자표시

  • 카카오스토리
  • 트위터
  • 페이스북

'STUDY > Python' 카테고리의 다른 글

[백준/Baekjoon] 1964번 오각형 파이썬/Python 코드  (0)2020.10.12[백준/Baekjoon] 1547번 공 파이썬/python 코드  (0)2020.10.11[백준/Baekjoon] 1085번 직사각형에서 탈출 파이썬/python 코드  (0)2020.10.11[백준] 1009번 분산처리 파이썬 코드  (0)2020.10.10[백준] 14681번 사분면 고르기 파이썬 코드  (0)2020.10.10

문제 설명

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

 

2448번: 별 찍기 - 11

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

www.acmicpc.net

문제의 별찍기 패턴을 보고 규칙을 유추하여 코드를 작성하는 문제이다.


풀이 과정

먼저, 백준에서 정답을 얻기 위해서는 공백을 포함한 그래프 전체를 출력해야 한다.

( 이 부분은 백준님이 정답코드를 잘못 기입하신 문제라고 한다. )

즉, N=24인 별찍기를 할 때 맨위에 별이 가운데 하나있을 때에도 양 옆으로 11개씩 공백을 모두 출력해야 한다.

 

처음 코드를 제출했을 때, 이 부분을 구현하지 않아 출력형식이 잘못되었다는 오류 결과를 받았다.

그래서, 별이 몇개든지 간에 별이 없는칸은 무조건 공백이 나오도록 코드를 수정하였다.

 

이 부분을 해결하면서 두 가지 풀이로 모두 풀어보았다.

 

풀이를 보기 전, 다음 규칙을 알고 보는것이 도움이 될 것이다.

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
N = 6

현재의 별찍기 모양은, 이전 별찍기 모양을 좌우로 두배 복사한 모양이다.

그래서 N = 6일 때는, N = 3 일때의 별모양이 양 옆으로 복사가 된 모습이다.

 

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
N = 12

마찬가지로, N = 12일 때는 N = 6의 별모양이 양옆으로 복사가 되어 나타난다.

이 규칙을 인지하고 풀이를 보면 이해하기 훨씬 수월할 것이다.

 

풀이①

먼저 n=3일 때는 가장 기본모형이므로 재귀문을 돌지않고 바로 출력하도록 하였다.

n=6일 때 부터 재귀문을 돌게되는데,

 

before는 이전 별찍기 모양, after는 현재 별찍기 모양을 저장한 리스트이다.

N줄 까지는 이전 별찍기 모양을 그대로 복사하면 되는데,

 

이 때, 백준제출을 성공하기 위해선 별을 제외한 양옆의 모든 칸을 공백으로 채워야 한다.

그래서 범위를 반드시 [N : (N+2*N) - 1] 으로 명시하여 지정한 부분 외에는 공백을 지키도록 해야한다.

 

N줄부터 2N줄까지는 이전 그래프의 모양을 양 옆으로 복사를 해야한다.

마찬가지로 공백을 지켜야 하기 때문에 범위 제한에 신경을 써주어야 한다.

 

이러한 방식으로 마지막 줄에 도착할 때 까지 계속 재귀를 돌려주면 된다.

n = int(input())

graph = [[" ", " ", "*", " ", " "], [" ", "*", " ", "*", " "], ["*", "*", "*", "*", "*"]]


def recursive(N, before):
    after = [[" "] * (2 * 2 * N - 1) for _ in range(2 * N)]
    for i in range(N):
        after[i][N:N+2*N-1] = before[i]

    k = 0
    for i in range(N, 2 * N):
        after[i][:2*N] = before[k]
        after[i][2 * N:2 * N+len(before[k])] = before[k]
        k += 1

    if 2 * N == n:
        return after

    return recursive(2 * N, after)


if n == 3:
    result = graph
else:
    result = recursive(3, graph)

for i in result:
    print("".join(i))

 

풀이②

풀이2는 풀이1처럼 이전그래프를 양옆으로 복사한다는 개념보다는

맨 처음 n = 3 일때의 그래프를 계속 양옆으로 복사해 나가는 방식이다.

 

n = 3일 때의 가장 기본모양을 바탕으로,

다음 모양부터는 좌표만을 계산하여 재귀적으로 그리면 된다.

파이썬 별찍기 원리 - paisseon byeoljjiggi wonli
풀이2
n = int(input())
graph = [[' '] * 2 * n for _ in range(n)]


def recursive(x, y, N):
    if N == 3:
        graph[x][y] = '*'
        graph[x + 1][y - 1] = graph[x + 1][y + 1] = '*'
        for i in range(-2, 3):
            graph[x + 2][y + i] = '*'
    else:
        nextN = N // 2
        recursive(x, y, nextN)
        recursive(x + nextN, y - nextN, nextN)
        recursive(x + nextN, y + nextN, nextN)


recursive(0, n - 1, n)
for i in graph:
    print("".join(i))

 

https://github.com/HongEunho

전체 문제 & 코드는 위의 깃에 정리되어 있습니다.

팔로우 & 맞팔은 환영입니다 !

 

공유하기

게시글 관리

구독하기AndroidTeacher

저작자표시

'Algorithm > Divide&Conquer' 카테고리의 다른 글

[백준] 2630 색종이 만들기 (Python 파이썬)  (0)2021.09.21[백준] 1074 Z (Python 파이썬)  (0)2021.09.21[백준] 1780 종이의 개수 (Python 파이썬)  (0)2021.09.19[백준] 1992 쿼드트리 (Python 파이썬)  (0)2021.09.19[백준] 2447 별 찍기 - 10 (Python 파이썬)  (0)2021.09.17