본문 바로가기
DEV/백준 알고리즘

백준 알고리즘 2438번, 2439번(파이썬)

by 올커 2022. 9. 14.

 

백준 알고리즘 2438번

Q. 백준 2438. 별 찍기-1

첫째줄 부터 N째줄까지 별이 하나씩 늘어나는 삼각형 모양을 만드는 프로그램을 작성한다.

(1) 입력 : 사용자로부터 첫째 줄에 100이하의 자연수 N을 입력받는다. (1 ≤ N ≤ 100)
(2) 출력 : 첫째 줄 부터 입력받은 N번째 줄까지 순서대로 별이 하나씩 늘어나도록 출력한다.


A. 풀이

 - 이번 문제는 sys모듈의 'stdin.readline()'을 활용하여 풀이하였다.

# Q 백준 2438. 별 찍기-1
import sys
num = int(sys.stdin.readline())

for i in range(1, num+1):
    print("*"*i)

1) 변수 선언부

 - input() 대신 sys.stdin.readline()을 사용한 이유
  : 백준 알고리즘 문제에서 속도를 요하는 문제에서는 'sys.stdin.readline()'를 사용하라고 권장하고 있다.

    둘의 큰 차이점은 구글링을 통해 확인해본 결과, '개행문자(\n)를 처리하였느냐' 였다.
    · input()은 개행문자를 처리한 결과를 나타내기 때문에 속도가 상대적으로 늦고,

    · sys.stdin.readline()는 개행문자를 처리하지 않고 그대로 나타내기 때문에 속도가 빠르다고 한다.

   ※ 참고 : 추가 설명 및 다른 언어 빠른 입출력 방법(Link) ,BOJ 작동원리(Link)

 - 따라서 sys.stdin.readline()를 사용할 때에는 개행문자가 붙어나온다는 이야기다.

   개행문자를 삭제하려면 아래 두 가지 방법 중 하나를 취한다.

   (1) 자료 타입을 int로 변환하여 개행문자 삭제하기

   (2) strip() 등과 같이 개행문자를 삭제하는 함수를 사용하기

 - 본 문제에서는 input()을 사용해도 정수형으로 변환하기 위해 int()는 사용해야 한다. 그렇기 때문에 결국 'int(sys.stdin.readline())' 라는 식으로 num을 입력받게 된 것이다.

 - readline()을 사용하기 위해서는 스탠다드 라이브러리 sys을 import하여 사용한다.

 

2) 반복문(for문) / 출력

 - for문은 별문자 '*'를 하나씩 증가시키며 출력하기 위해 사용되었다.

 - 맨 첫줄에 별문자가 하나는 출력되어야 하기 때문에 for문의 i는 1부터 시작해야 하고, 마지막줄에는 num의 숫자만큼 입력되어야 하기 때문에 range는 'range(1, num+1)'으로 입력되었다.

 - for문 안쪽의 명령 print문은 문자열 * 숫자의 형식이다.

   (*파이썬에서 문자열은 사칙연산이 가능하며 본 문제에서는 곱셈이 사용됨. ex)'A' * 8 = 'AAAAAAAA')

 

 

 

백준 알고리즘 2439번

Q. 백준 2439. 별 찍기-2

아래와 같이 첫째줄 부터 N째줄까지 별이 오른쪽 정렬 상태로 하나씩 늘어나는 모양을 출력하는 프로그램을 작성한다.

(1) 입력 : 사용자로부터 첫째 줄에 100이하의 자연수 N을 입력받는다. (1 ≤ N ≤ 100)
(2) 출력 : 첫째 줄 부터 입력받은 N번째 줄까지 순서대로 별이 오른쪽 정렬상태로 하나씩 늘어나도록 출력한다.


A. 풀이

 - 위의 문제와 거의 유사하지만, 오른쪽 정렬 되어야 한다.

# Q 백준 2439. 별 찍기-2
import sys
num = int(sys.stdin.readline())

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

 - 대부분 유사하기 때문에 본 문제는 차이점만 따로 기록한다.

 - 시스템에서 오른쪽 정렬을 나타낸다는 개념은 오른쪽 선까지 공백' '을 입력해준다는 개념으로 이해해야 한다.

   (*사실 이는 공백이건 문자건 터미널 출력창에서 같은 크기의 칸을 차지한다는 전제조건을 이해하고 있어야 한다.)

 

2) 반복문(for문) / 출력

 - for문의 range는 동일하게 range(1, num+1)로 지정한다.

 - 입력받은 num은 그려지게될 그림의 가로길이라고 생각한다.

   가로길이의 맨 오른쪽은 별문자가 1부터 num까지 하나씩 커질것이고, 반대로 공백문자' '는 num-1부터 0까지 줄어들며 왼쪽부분을 차지해야 하기 때문에 'print(" " * (num-i) + "*" * i)' 와 같이 표현한다.

 


R. 리뷰

 - 파이썬 스탠다드 라이브러리의 readline()함수를 잘 이해하고 사용할 필요가 있다.

 - 문자열의 사칙연산을 잘 활용해야 하며, 출력값이 어떻게 그려질지 미리 생각해보고 문제를 접근해야 한다.

 - for문의 반복 범위를 지정하는 range를 착오하지 않도록 잘 지정해야 한다.

 

 

반응형

댓글