다양한 출력 방법

1주차에서 우리는 가장 대중적인 출력 방법인 print를 배웠습니다.

이번에는 print에 안에 입력하여 사용하는 end, format, join에 대해 알아봅시다.

입출력

end

print함수에는 end라는 인자에 값을 넣을 수 있습니다. 이 기능은 출력하는 문자 끝에 어떤 것을 더 출력할지 정해주는 인자입니다.

우리가 print함수를 쓰면 자동으로 마지막에 줄 바꿈이 적용되는데요. 이 print에 있는 end인자의 기본값이 줄 바꿈('\n')입니다.

print('aaa', end = '\n')
for i in range(5):
    print(i+1, end = ', ')
    
#1, 2, 3, 4, 5, 

위와 같이 end = ', '를 추가해서 1, 2, 3, 4, 5, 를 출력할 수도 있습니다.

깔끔하게 마지막에 5 오른쪽에 , 를 없애려면 아래 코드처럼 if / else문을 사용할 수 있습니다.

for i in range(5):
    if i != 4:
        print(i+1, end = ', ')
    else:
        print(i+1) # 또는 print(i+1, end = '')

나중에 다른 문제들을 풀 때, end 인자에 값을 넣어야 하는 경우 사용해보시면 됩니다.

풀어볼 문제

format

이 문제를 봅시다. A+B를 출력하는 방법은 쉬울 것이고, 출력하는 것이 문제인데 지금까지 배운 print와 콤마(,)와 문자열끼리 붙여주는 + 연산자를 이용해서 코드를 만들어 보았습니다.

t = int(input())
for i in range(t):
    a, b = map(int,input().split())
    print('Case #' + str(i+1) + ':', a+b)

이렇게 하면 문제를 풀 수 있지만 print부분의 코드가 많이 더러운 편입니다. 그래서 코드를 좀 더 깔끔하게 적을 방법인 format을 소개하겠습니다.

format은 print('내용'.format())으로 작성할 수 있으며 변수를 출력할 내용 부분에는 {}를 입력해주며, 소괄호 안에 거기에 들어갈 수를 적어주면 됩니다. 위 문제를 예시로 들자면 아래 코드처럼 바꿀 수 있습니다.

t = int(input())
for i in range(t):
    a, b = map(int,input().split())
    print('Case #{}: {}'.format(i+1, a+b))

따옴표 부분에는 필요한 내용만 적고, 변수들은 전부 괄호 안에 넣으면 되므로 확실히 가독성이 좋아지게 됩니다.

그리고 format에서 {}에는 인덱싱을 지원해줍니다.

for i in range(t):
    a, b = map(int,input().split())
    print('Case #{1}: {0}'.format(a+b, i+1))

이렇게 a+b와 i+1을 서로 순서를 바꿔서 입력을 해도 {1}, {0}처럼 이렇게 중괄호 안에 숫자를 넣으면 정상적으로 나오게 만들 수 있습니다. 하지만 일부러 저렇게 문제를 풀지는 않겠지요.

format을 사용하는 문제는 보통 위에 A + B - 7 문제와 같이 출력 내용에 고정된 문자열 내용이 있을 때 사용하는 편입니다.

풀어볼 문제

참고로 format에는 소수점을 필요한 부분까지만 출력할 수 있는 기능도 있습니다.

일단 원의 넓이는 pi * 반지름 * 반지름이고, 택시 기하학은 무슨 소리인지 모르겠는데 예제를 보니까 원의 넓이는 2 * (반지름) * (반지름)인 것 같습니다.

출력은 소수점 아래 6자리이고, 정수 값이 나와도 무조건 소수점 아래 숫자를 0으로 채워야 하네요.

일단 소수점을 출력하는 방법은 {0:.6f}로 이 문제에서는 6자리를 출력하니까 6을 적으면 됩니다. 소수점 아래 3자리만 출력한다면 {0:.3f} 입니다.

pi = 3.14159265359
r = int(input())
print('{0:.6f}'.format(pi*r**2))
print('{0:.6f}'.format(2*r**2))

위 코드에 나온 pi 값은 소수점 6자리를 넘어서 11자리를 나타내고 있는데요. 이는 답의 오차가 0.0001까지만 차이가 나야 정답으로 인정되기 때문에 3.141592를 사용할 경우 틀린 답이 나오게 됩니다. 아래에 관련 내용을 적어두었습니다.

r = 10000일 때
pi의 값을 3.141592로 설정하여 계산 -: 314159200.000000
pi의 값을 소수점 아래 10자리까지 계산: 314159265.350000
pi의 값을 소수점 아래 11자리까지 계산: 314159265.359000
실제 pi의 값을 용----------------: 314159265.358979
둘의 값 차이는 0.000021로 0.0001보다 작기 때문에 정답이 될 수 있음

풀어볼 문제

join은 문자열을 읽은 후에 읽으시면 됩니다.

join

join 함수는 iterable(문자열, list, tuple, set, dict 등) 요소 사이에 문자열을 출력하는 방식입니다. 문자열의 경우에는 한 글자씩 분리되어 출력을 할 수 있습니다.

D = ['apple', 'banana', 'cherry']
print(' '.join(D))
# apple banana cherry

D = 'apple'
print(' '.join(D))
# a p p l e

위 코드는 ' '.join(D)로 따옴표 사이에 공백 한 칸을 넣었는데요. 이러면 자료구조면 각 요소 사이, 문자열이면 각 문자 사이에 공백을 한 칸씩 주어서 출력을 할 수 있게 해줍니다.

D = ['apple', 'banana', 'cherry']
print(', '.join(D))
# apple, banana, cherry
D = 'hello'
print('---'.join(D))
# h---e---l---l---o

이렇게 다양하게 출력할 수 있습니다.

주의할 점은 요소들은 문자열이어야 한다는 것입니다. 요소 값에 int형이나 float형 같은 것이 있으면 오류를 출력하므로 문자열(str)로 변경해야 합니다.

우리가 여러개의 값을 input으로 입력 받을 때 map이라는 함수를 사용하는데, 여기서도 map이 사용됩니다.

D = [1, 2, 3]
print(','.join(map(str, D)))
# 1,2,3

이렇게 D배열에 있는 요소 값들을 str형으로 바꿀 수 있습니다.

for문을 돌려 반복한 횟수만큼 별을 만들어서 list에 저장해봅시다.

n = int(input())
ans = []
for i in range(n):
    ans.append('*'*(i+1))

위와 같이 출력할 별들을 ans라는 리스트에 값을 저장할 수 있습니다. 출력할 때에는 엔터키인 줄 바꿈('\n')을 사용하여 출력하면 되겠습니다.

n = int(input())
ans = []
for i in range(n):
    ans.append('*'*(i+1))
print('\n'.join(ans))

또 다른 문제를 풀어봅시다.

알파벳 소문자만 들어 있는 단어 S가 주어지는데, S에 들어간 알파벳이 각각 몇 개 들어가 있는지 출력하는 문제입니다.

일단 이 문제는 아스키 코드로 풀 수 있습니다. 하지만 아스키 코드를 2주차에 설명하기에는 너무 분량이 많은 것 같아서 잠깐 이용 방법만 알려드리려고 합니다.

아스키 코드는 컴퓨터가 0과 1로만 표현이 가능해서 문자를 읽지 못하기 때문에 각 문자를 숫자로 나타내는 방법입니다.

알파

아스키 코드

a

97

b

98

c

99

d

100

e

101

f

102

g

103

h

104

i

105

j

106

k

107

l

108

n

109

m

110

o

111

p

112

q

113

r

114

s

115

t

116

u

117

v

118

w

119

x

120

y

121

z

122

이렇게 a ~ z는 각각 97 - 122까지 매칭이 됩니다.

문자의 아스키 코드를 출력하는 함수는 ord()입니다. 반대로 아스키 코드를 문자로 변환하는 함수는 chr()입니다.

print(ord('a')) # 97 출력
print(chr(97)) # a 출력

이 아스키 코드를 통해 리스트와 인덱싱을 이용하여 문제를 풀려고 합니다.

어떻게 적용하냐면 소문자 알파벳의 아스키 코드가 ord('a')-97 = 0, ord('b') - 97 = 1, ord('c') - 97 = 2, .... , ord('z') - 97 = 25 이렇게 연속적으로 이루어져 있으므로 길이가 26인 리스트를 이용하여 문제를 풀 수 있습니다. 그리고 for문을 이용해서 한 글자씩 문자를 입력 받아서 97을 빼주고 값을 처리해주면 되겠네요.

s = input()
arr = [0]*26
for i in range(len(s)):
    x = ord(s[i]) - 97
    arr[x] += 1

그다음엔 join을 이용하여 문자를 출력하면 됩니다. 각 요소 사이에 있는 문자는 공백이니 공백 한 칸을 넣어주면 되겠네요. 그리고 arr의 요소 값들은 int형이니까 str형으로 바꾸어주어야 합니다.

s = input()
arr = [0]*26
for i in range(len(s)):
    x = ord(s[i]) - 97
    arr[x] += 1
print(' '.join(map(str,arr)))

아스키 코드 문제는 4주차에 풀 예정이니 이렇게도 풀 수 있다는 것만 알아두세요! 아스키 코드는 나중에 배울 카이사르 암호(시저 암호) 문제를 풀 때도 쓰입니다.

현재 join을 이용할 문제가 공백이나 줄 바꿈을 출력할 문제밖에 찾을 수가 없네요. 줄 바꿈은 앞으로도 print로만 출력할 확률이 높은 것 같아서 공백만 출력하는 문제들만 모아보았습니다.

풀어볼 문제

Last updated