python/알고리즘 문제풀이

[백준2562]최댓값/ read와 readlines의 차이/ python

빛날희- 2021. 2. 20. 22:51

1차원 배열을 이용한 문제다. 

 

▶이번 문제는 두가지 방식으로 풀어보았다.

 

첫번째는 내가 자주 사용했던 for문과 input함수를 사용한 방식이다. 

lst=[]
for i in range(0,9):
    lst.append(int(input()))
print(max(lst),lst.index(max(lst))+1, sep='\n')

# list.index(val): list배열에서 val원소의 위치를 반환하는 함수

 

결과는, 

역시 이전글에서 언급했듯이 for문과 input을 이용한 코드는 속도도 느리고 코드도 길다. 

그래서 전의 문제를 풀면서 알게된 sys.stdin을 해당 문제에서 사용해보고자 했다.

 

 

 

그렇게 작성한 두번째 코드는 다음과 같다. 

import sys
lst= list(map(int,sys.stdin.read()))
print(lst)
print(max(lst), lst.index(max(lst))+1, sep='\n')

그런데 문제가 발생했다.

해당 코드를 실행해보니 불러온 값에서 \n때문에 int함수를 실행하는데 에러가 발생했다고 뜬다. 

 

생각해보니, read함수는 "파일을 하나의 string으로 읽어오기" 때문에 입력한 input 값을 "1\n2\n..."으로 불러온다. 문자 '\n'에 대해서는 int함수를 적용할 수 없기 때문에 해당 에러가 발생한 것이었다. 

 

이를 해결하고 엔터로 구분된 input값들을 리스트로 불러오기 위해선 readlines()함수를 사용하면된다. 


예시)

import sys
lst=sys.stdin.readlines()
print(lst)

결과에서 볼 수 있듯이 readlines는 해당 input을 라인별로 리스트 형태로 불러왔다.

 

 

 

▶하지만 여기서 드는 의문점이 있다.

 

리스트의 원소를 보면 위의 경우와 마찬가지로 문자열 안에 개행문자 \n을 포함하고 있다. 하지만 이 경우엔 이전과 달리 int함수를 사용하면 제대로 적용된다. 그 이유는 \n뒤에 아무 문자가 없는 경우에 \n 자체를 문자열이 아닌 개행문자로 인식하기 때문이다. 위의 경우에선 \n 뒤에 다른 문자가 있었기 때문에 \n이 문자열로 읽혀 int함수를 적용할 수 없었던 것이다. 

 


해당 함수를 통해 코드를 다시 작성했다.

import sys
lst= list(map(int,sys.stdin.readlines()))
print(lst)
print(max(lst), lst.index(max(lst))+1, sep='\n')

 

lst의 값들을 출력해본 결과, 값들이 리스트에 int형태로 잘 들어가 있다. 

 

첫번째 코드의 결과와 비교했을 때 메모리와 시간이 다소 줄어든 것을 볼 수 있다. 

 


해당 문제에서 쓰이진 않았지만 readline()은 파일을 한줄한줄 읽어온다. 따라서 readline함수를 쓸 경우, lst의 원소로는 입력 값의 가장 첫번째 줄인 '3\n', 하나만 들어갈것이다.