본문 바로가기
Algorithm/HackerRank

[HackerRank] Staircase(풀이 성공)

by 전봇대파괴자 2020. 12. 31.

 

문제

 

입력값 n을 input 했을 때(0≤n≤100), '#'만으로 이루어진 n개의 층을 가진 탑이 출력되도록 한다.

단, 탑의 층수와 해당 층에 존재하는 문자의 수는 같으며, 오른쪽 정렬로 출력한다.


Sample Input :

6

 

Sample Output :

     #
    ##
   ###
  ####
 #####
######

내 코드:

import math
import os
import random
import re
import sys

def staircase(n):
    star = '#' # 탑을 쌓을 문자
    space = ' ' # 오른쪽 정렬을 만들 공백
    li = []
    count = 1 # 층을 만들 카운트
    while True:
        li.append(space*(n-count) + star*count) # 카운트 수에 따라 #개수와 공백 수를 조절
        count += 1
        if count > n: # 카운트가 n보다 커졌을 경우 루프 정지
            break
    return li  
    

if __name__ == '__main__':
    n = int(input())
    star = staircase(n)
    for i in star: # 리스트를 첫 번째 item부터 한 줄씩 출력
        print(i)

 

Comment: 기본적으로 한 개의 층이 될 item을 모아 list를 만들고, for문을 통해 하나씩 출력하는 게 핵심입니다. 하지만 처음에는 머릿속에 어떻게 하면 될지 잘 그려지지 않더라고요. 그래서 특정한 숫자를 입력했을 때 그 숫자만큼의 특수문자를 출력하는 함수를 만들어보기도 했습니다. 아래는 그 함수입니다. 

def makestar(n):
    spec = '#' # n개만큼 출력할 특수문자
    li = [] 
    for i in range(n): # 1회 루프를 반복할 때마다 #을 list에 추가
        li.append(spec)
    return ''.join(li) # list 안의 #을 하나의 string으로 통합

if __name__ == '__main__':
    n = int(input())
    star = makestar(n)
    print(star)

하지만 range를 쓰면 나중에 따로따로 떨어진 문자들을 합치기 위해 join을 반드시 써야 한다는 점이 번거롭습니다. 생각해보니 +(더하기)와 *(곱하기)를 잘 사용하면 더 간단히 코드를 짤 수 있더라고요. 

star = '#'
print(star+star)

>> ##

print(star*5)

>> #####

space = ' '
print(space+star)

>>  #

print((space*4)+star)

>>     #

이걸 잘 활용하면 다른 문제를 풀 때도 유용하게 쓸 수 있을 것 같습니다.

늘 기초가 참 중요하네요.