백준 1152번 & Python List comprehension

최인호·2024년 3월 7일

백준

목록 보기
1/1

바보짓

백엔드 공부 + 프로젝트를 병행 하다보니 어느새 C, Java, Python 등.. 열심히 공부했던 내용들을 어느새 까먹고 있음을 인지해서 오늘부터 깃허브에 잔디를 심어보자 하고 백준 문자열부터 다시 풀이를 하고 있었다.

그래도 어느정도 도전과 실패를 반복하다보니 옛날 처음 백준을 접했을 때는 기초 문제마저 여러번 틀리고 그랬는데 오늘 해보니 1번만에 전부 통과를 했다 !! 단 이 문제 빼고..

백준 1152번 문제 단어의 개수를 보자마자 문제를 너무 대충 읽어서인가?

이런식의 코드를 작성했다

words = input('')
words = words.split(' ')
print(len(words))


테스트 케이스 1번만 보고 내가 아무렇게나 입력해봐도 올바른 단어 수가 나오길래 당당히 제출했는데 그렇다.. 당연히 오답이 나왔다

깜짝 놀랐지만 바로 2번 테스트 케이스를 입력했는데 내 환경에서는 7이 나오더라
자세히 보니까 맨 앞에 공백이 있었고, 저 상태로 split을 하게 되면 공백이기 때문에
이렇게 리스트의 요소로 공백이 추가 되어 내가 예상한 길이 +1만큼의 결과가 나온 것이다.

그럼 나는 이 공백을 없앨 방법을 생각해봤다.
내가 떠오른건 첫번째로

1. filter 함수 이용

filter 함수의 1번째 매개 변수로 None을 주게 된다면, 공백이 사라진다.

words = input('')
words = words.split(' ')
words = list(filter(None, words))
print(len(words))

이 외에도 다른 방법은 없을까? 고민하다가 리스트임을 고려해서 작년쯤 봤던 파이썬 알고리즘 책에서 공부했던 List Comprehension 개념이 떠올랐다.

2. List Comprehension

우선 파이썬에서는 빈 문자열 ''이 False로 취급된다는 점을 알고 가야한다.

파이썬에서 False로 취급되는 것들

빈 문자열 : ''
숫자 0
숫자 0.0
빈 리스트 : []
빈 튜플 : ()
빈 딕셔너리 : {}
'None'

즉 위의 값들은 False로 취급하기 때문에 조건문이 실행되지 않는다.

List Comprehension
구조는 다음과 같다

[ 표현식 for 항목  in 반복 가능 객체 if 조건문 ]
  • 표현식 : 리스트 새로운 요소를 정의 (변수, 함수 호출, 실제 값 등)
    예시로 num*2는 항목의 값을 두배로 하는 표현식
  • 항목 : 반복 가능 객체로부터 하나씩 가져온 개별 요소
  • 반복 가능 객체 : 리스트, 튜플, 문자열, 딕셔너리 등 반복을 통해 그 요소들을 하나씩 순회할 수 있는 모든 객체
words = input('')
words = words.split(' ')
words = [w for w in words if w]
print(len(words))

따라서 위의 코드와 같이 words의 요소들을 하나씩 반복하며 요소 w가 참일 경우만 리스트에 포함 시킴으로써 False를 반환하는 '' 공백은 걸러내는 것이다.


1번과 2번 방식 모두 속도는 비슷한 것 같다..??
아무튼 이 개념을 공부할 당시 내가 딱히 쓸 일이 있을까? 했는데 이런식으로 다시 만나게 될 줄은 몰랐다.

다시 알고리즘 공부를 시작하게 된 지금 앞으로 종종 책에 공부한 내용을 여기에 쉽게 정리하고 공유해야겠다.

0개의 댓글