python

[Troubleshooting] sys.stdin.readline() 꼭 개행문자 제거하자!

2023. 5. 22. 15:52
목차
  1. 문제상황:
  2. 시도
  3. 해결:
  4. 최종 해결:

문제상황:

다음과 같이 코드를 작성했을 때 출력결과가 이상하게 줄바꿈이 자꾸 되는 것이다!!

for key, value in sorted(files.items()):
	print(key, str(value))

출력결과

시도

원인을 파악하려고 몇가지 방법을 시도해봤다

  • print문 변경 ---> 결과 똑같음,,
print(key + " " + str(value))
print("{} {}".format(key, str(value)))
  • print문 뒤에 end="" 추가
print(key, str(value), end="")

출력결과

흠.. 아무래도 key 값을 출력할 때만 줄바꿈이 들어가는 것 같다..??

  • 확인해보자!
for key, value in sorted(files.items()):
    print("===" + str(key) + "====")

출력결과

흠 역시나 dictionary에서 key 값을 가져올 때 자동으로 줄바꿈이 들어가 있는 것 같다. 그럼 줄바꿈을 빼고 출력해보자!

 

해결:

for key, value in sorted(files.items()):
    print(key.strip(), str(value))

출력결과:

잘 나온다!! 끄읏

 

 

+++++++

다시 찾아보니 dictionary에서 가져올 때 개행문자가 들어가는 것이 아니라 애초에 dictionary에서 넣을 때부터 개행문자가 들어가 있었다..

files = {}
for i in range(num):
    name, ext = sys.stdin.readline().split('.')
    print("====" + ext + "====")
    if ext in files.keys():
        files[ext] += 1
    else:
        files[ext] = 1

딕셔너리에 넣기 전 출력해서 확인해보니,, 역시나,, 하핳

진짜 원인: 백준 풀 때는 시간초과 때문에 반복문 안에서는 보통 input() 대신 sys.stdin.readline()을 사용하고 있었는데 sys.stdin.readline()는 한줄 단위로 입력 받기에 개행문자가 같이 입력 받아진다. 그래서 꼭 rstrip()이나 strip()을 사용하여 개행문자를 제거해야 하는데 오랜만에 백준 풀었더니 깜빡했다,, ㅎㅎ

 

최종 해결:

import sys

num = int(input())

files = {}
for i in range(num):
    name, ext = sys.stdin.readline().rstrip().split('.')
    if ext in files.keys():
        files[ext] += 1
    else:
        files[ext] = 1

for key, value in sorted(files.items()):
    print(key, str(value))

출력결과:

잘 나온다!! 하핳 오늘도 바보같은 실수를 해버렸넹


그런데 백준 제출해보니 조금 느린 것 같아서 개선을 해보았다.

version 1


아무래도 딕셔너리를 정렬하는 부분에서 시간을 잡아먹는 것 같았다. 그래서 정렬하는 부분을 리스트로 바꿔보았다1

import sys

num = int(input())

files = {}
file_list = []
for i in range(num):
    name, ext = sys.stdin.readline().rstrip().split('.')
    if ext in files.keys():
        files[ext] += 1
    else:
        files[ext] = 1
        file_list.append(ext)

file_list.sort()
for _ in file_list:
    print(_, files[_])

Version 2

오오 메모리 사용량도, 시간도 조금 줄었다! 그래도 여전히 안 좋아보인다,,


리스트를 굳이 사용하지 말고 기존에 딕셔너리의 items 를 찾아서 정렬하는 부분이 오래 걸렸던 것 같아서 그 부분을 key로만 정렬하고 value는 키로 가져오는 형식으로 바꿨다.

import sys

num = int(input())

files = {}
for i in range(num):
    name, ext = sys.stdin.readline().rstrip().split('.')
    if ext in files.keys():
        files[ext] += 1
    else:
        files[ext] = 1

for _ in sorted(files.keys()):
    print(_, files[_])

Version 3

조금 더 줄었다! 흠.. 근데 이젠 더 어떻게 바꿔야 할 지 모르겠다..

혹시나 이 글을 보고 계신다면 더 좋은 방법 있으면 알려주시면 감사하겠습니다:D

 

이젠 정말정말 끄읏~

  1. 문제상황:
  2. 시도
  3. 해결:
  4. 최종 해결:
jooyeongmee
jooyeongmee
jooyeongmee
jooyeongmee
jooyeongmee
전체
오늘
어제
  • 분류 전체보기 (26)
    • 웹백엔드 (5)
    • 웹프론트엔드 (0)
    • Tips (0)
    • java (0)
    • python (1)
    • TIL (18)
    • 알고리즘 (2)
    • Projects (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • web
  • 서버
  • 네트워크
  • http
  • 알고리즘
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.
jooyeongmee
[Troubleshooting] sys.stdin.readline() 꼭 개행문자 제거하자!
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.