코테를 풀다보면 입출력을 포함해서 많은 자잘한 실수를 겪게 되는데, 이것 해결에 쓰는 시간을 줄이는 것이 실제로 많은 시간 확보를 해 주는 주요 비결이다. 여기서는 자주 범하는 실수를 모아두고 계속 업데이트 하겠다.
1. 문자열 입출력
########
#..#...#
####.#.#
#..#...#
########
위와 같은 문자열 입력시 혹시 (줄 수 n=5, 열 수 m=8는 주어짐) 아래처럼 하는가?
array = [input().split() for _ in range(n)]
이러면 다음처럼 입력이 된다.
[['########'], ['#..#...#'], ['####.#.#'], ['#..#...#'], ['########']]
정말 바보같은 일이다. 왜냐면 문자열은 그 자체로 배열인데, 이것을 입력받고, 굳이 split()을 통해 리스트 안에 원소로 가둬두려다가, 결국 split이 안되니까 한 줄 문자열이 통으로 list의 한 원소로 들어가 있는 것이다. split()은 심지어 split('') 처럼 하더라도 저 문자열을 분리해 주지 못한다. 그러므로 문자열은 그 자체로 배열임을 명심하고 다음처럼 하자.
array = [input() for _ in range(n)]
>>> array
['#..#...#', '####.#.#', '#..#...#', '########', '########']
그러면 얼마든지 array[0][2] 와 같이 액세스가 가능하다 ('.')
2. 차원을 잊어버린 list comprehension
이제 다음처럼 array의 값에 따라 같은 사이즈의 배열에 조건을 기록하고자 한다.
visited = [True if array[r][c] == '#' else False for r in range(n) for c in range(m)]
>>> visited
[True, False, False, True, False, False, False, True, True, True, True, True, False, True, False, True, True, False, False, True, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
분명한 오류이다. 우리는 array 처럼 2차원 배열로 이를 기록하고 싶다. 그러면 bracket을 빼먹지 말아야 한다. 원하는 형태 그대로 [] 를 찍어주자.
visited = [[True if array[r][c] == '#' else False for r in range(n)] for c in range(m)]
>>> visited
[[True, True, True, True, True], [False, True, False, True, True], [False, True, False, True, True], [True, True, True, True, True], [False, False, False, True, True], [False, True, False, True, True], [False, False, False, True, True], [True, True, True, True, True]]
이제 visited도 2차원으로 액세스가 가능하다. 그러나 뭔가 또 틀린 건 없는가? 모양이 애초의 입력된 5 x 8과 다르다. 그건 행의 수를 안쪽 []에 넣었기 때문이다. 이런 실수는 숙달되기까지 쉽게 발생한다.
visited = [[True if array[r][c] == '#' else False for c in range(m)] for r in range(n)]
>>> visited
[[True, True, True, True, True, True, True, True], [True, False, False, True, False, False, False, True], [True, True, True, True, False, True, False, True], [True, False, False, True, False, False, False, True], [True, True, True, True, True, True, True, True]]
꾸준한 연습이 필요하다.
관련된 문제의 풀이는 다른 글에 소개하겠다 (https://algoship.tistory.com/32).
'Soft Talks' 카테고리의 다른 글
테크 업계 이직시장 리뷰 (2) | 2023.01.10 |
---|---|
Online Judge Runtime Error (RE/RTE) 원인: I/O (0) | 2022.11.27 |
면접 전에 꼭 할 일 (0) | 2022.11.19 |
카카오 개발자 영입 합격수기 (2) | 2022.10.03 |
g++ compiler로 c++11 실행하기 (0) | 2022.05.02 |