[파이썬] <구현> 별찍기 정복 (BOJ-2438 외 9문제)
코딩 기초 바이블, 별찍기.
원래 별찍기는 전공필수 수업에서 처음 프로그래밍을 접한 나에게 좌절을 안겨주었었다. (아마 C였고 파이썬이 아니어서 그랬을 수도 있다.) 당시에는 이해가 안됐는데 시험은 봐야했기 때문에 무작정 외우기만 했다.
이제는 다르다.
별찍기 10문제로 정복해보자!
별찍기 문제들로 얻은 지식
-
매번 헷갈렸던 for문의 range에 대한 정확한 이해.
range는 세 가지 인수를 갖는다.
//인자의 갯수에 따라 의미하는 바가 다르다.
for i in range(시작숫자, 끝숫자, 간격):
for i in range(시작숫자, 끝숫자):
for i in range(끝숫자):
시작 숫자는 i의 처음을 말한다.
끝 숫자는 마지막 숫자를 말하는 것이 아닌 마지막의 -1까지만 포함이 된다.
간격을 통해 숫자들의 순서, 간격을 설정할 수 있다.
문제를 풀 때 가장 많이 이용했던 오름차순, 내림차순을 알아보자.
i = 5
## 오름차순
for i in range(1, i + 1): ## 간격 칸에 아무것도 적지 않으면 +1이 디폴트 값이다.
print(i) ## 1, 2, 3, 4, 5
## 내림차순
for i in range(i, 0, -1): ## 1씩 빼 주는 것. 그리고 0보다 1 큰 1까지만 출력 됨
print(i) ## 5, 4, 3, 2, 1
-
파이썬에서는 string값도 연산이 가능하다.
-
print 마지막에 end=''를 적으면 다음의 프린트 값이 줄바꿈 되지 않고 바로 출력된다.
-
별과 공백 중 제일 먼저 오는 값을 기준으로 for문을 적는다. 이는 아래에서 더 설명하겠음.
문제 링크는 www.acmicpc.net/problem/{문제의 숫자} 를 적으면 된다.
이 글의 모든 코드들은 백준에서 통과한 코드입니다.
저는 *과 공백을 변수화 시켰지만 안하셔도 됩니당... 변수화 시키는게 뭔가 습관이 돼 버려서,,,
BOJ-2438
아주 기본적인 문제.
for 문으로 별만 출력하면 된다.
star = '*'
n = int(input())
for i in range(1, n + 1):
print(i * star)
BOJ-2439
여기서부터 본격적으로 공백이 들어간다.
첫 줄을 잘 보면, 공백이 4개, 별이 1개이다.
시작이 공백 4개이므로, 내림차순으로 for문을 짠다.
space = ' '
star = '*'
n = int(input())
for i in range(n, 0, -1):
print(space * (i - 1) + star * (n - (i - 1)))
BOJ-2440
이 문제는 딱히 공백을 신경쓰지 않아도 된다.
그냥 별만 내림차순으로 출력하기만 해도 된다.
n = int(input())
star = '*'
for i in range(n , 0, -1):
print(i * star)
BOJ-2441
공백을 오름차순으로 0부터 출력하고 다음 별을 n - i의 갯수 만큼 출력해 둘을 더한다.
n = int(input())
star = '*'
blank = ' '
for i in range(0, n):
print(blank * i + star * (n - i))
BOJ-2442
우선 빈칸으로 내림차순을 구현하고, 별이 줄이 늘어날 때 마다 두 개씩 증가하는 양상을 보이기에 구현 후, stars 변수에 2를 더해준다.
n = int(input())
star = '*'
blank = ' '
stars = 1
for i in range(n, 0, -1):
print(blank * (i - 1) + stars * star)
stars += 2
BOJ-2445
다섯줄도 아닌데 왜 n이 5일까?
이렇게 나눠서 생각해보면 된다.
for문을 두 개를 이용해서, 윗칸, 아래칸을 구현한다.
별을 오름차순, 공백을 별 갯수로 빼고, 다음 공백도 같은 것을 더한 후 별을 오름차순 시킨다.
ABBA로 더해주면 된다.
n = int(input())
star = '*'
space = ' '
for i in range(0, n):
print(star * (i + 1) + space * (n - (i + 1)) + space * (n - (i + 1)) + star * (i + 1))
for i in range(n-1, 0, -1):
print(star * i + space * (n - i) + space * (n - i) + star * i)
BOJ-2522
위와 비슷하게 출력결과를 나눈다.
반대쪽은 구현 할 필요가 없기 때문에 바로 두번째, 아래쪽 for 문을 구현한다.
하지만 위쪽은 end =''를 사용하지 않아 코드가 가로로 길게 가독성이 적다면,
이번 문제 부터는 end = ''를 이용해 가독성을 높였다.
n = int(input())
star = '*'
space = ' '
for i in range(n, 0, -1):
print(space*(i - 1), end = '')
print(star*(n - (i - 1)))
for i in range(1, n):
print(space*(i), end='')
print(star*(n - i))
BOJ-2446
아래처럼 굳이 나누지 않고 별이 이어져 있기 때문에 한번에 코딩해도 될 듯 하다. 이 문제는 위의 문제들과 비슷하게 풀면 된다.
n = int(input())
star = '*'
space = ' '
for i in range(0, n):
print(space * i, end='')
print(star * (n - i), end='')
print(star * (n - i - 1))
for i in range(n - 1 , 0, -1):
print(space * (i - 1), end='')
print(star * (n - i), end='')
print(star * (n - i - 1)))
BOJ-10991
자세히 보면, 별-공백-별-공백의 규칙이 있다.
때문에, 별-공백을 한 세트로 묶어서 star 변수에 넣는다.
그리고 앞의 내림차순 공백과 함께 코딩한다.
n = int(input())
star = '* ' ## 별-공백
space = ' '
for i in range(n , 0 , -1):
print(space * (i - 1), end='')
print(star * (n - (i - 1)))
BOJ-10992
이 문제는 생각해야 할 점이 꽤 있다.
우선 본인은... 짝수 줄에는 공백이 있는 줄 알고 그렇게 코딩했으나, 공백은 없었고 더 간단한 문제였다.
맨 첫 줄과, 마지막 줄은 항상 별 한개, 풀별이기 때문에 둘을 예외로 두었다.
그리고 별의 수와 입력받은 수가 같지 않기 때문에, 별의 수는 따로 변수를 주고,
계산을 해 보니, 입력받은 수 * 2 - 1임을 알게 됐다.
중간의 별은 공백 + 별 하나, 공백 + 별 하나 식으로 계산했다.
n = int(input())
line = n * 2 - 1
star = '*'
space = ' '
for i in range(n, 0, -1):
if i == n: ## 첫번째 줄은 항상 별이 하나
print(space * (line // 2), end = '')
print(star)
elif i == 1: ## 마지막 줄은 항상 별이 line개
print(star*line)
else: ## 나머지
print(space * (i - 1) + star, end = '' )
print(space * (line - i * 2) + star)
이 정도 왔으면 별찍기는 감이 올 것이다.
아직 얼마 공부를 하지는 않았다만, 역시 문제풀이는 반복만이 살 길이다...