Soft Talks

오류노트

Algorithmus 2022. 5. 11. 22:55

코테를 풀다보면 입출력을 포함해서 많은 자잘한 실수를 겪게 되는데, 이것 해결에 쓰는 시간을 줄이는 것이 실제로 많은 시간 확보를 해 주는 주요 비결이다. 여기서는 자주 범하는 실수를 모아두고 계속 업데이트 하겠다.

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