백준 문제를 파이선으로 풀 때, 많이 써먹는 함수 중에 하나는 split입니다. 이 함수에 대해 간단하게 알아보겠습니다.

 


 먼저, input은 입력 받은 것을 str로 리턴해 줍니다. 우리가 python으로 ps를 할 때, input().split()를 많이 써먹습니다. 예를 들자면 아래와 같이 입력이 들어왔을 때입니다.

 

 이것은 공백을 기준으로 나누어진 예입니다. 100, 100을 받으려면, 1번째 줄을 통째로 입력받고 그것을 공백을 기준으로 나눠야 합니다. 이 때 써먹을 수 있는 메서드는 built in 함수인 split 입니다. 사용 용례를 보겠습니다.

 

 

 결과 먼저 보면, ab-cd-ef로 입력을 받아서, output으로 내놓은 것은 ['ab', 'cd', 'ef'] 입니다. 즉, 무언가를 기준으로 나누어진 토큰들의 list를 리턴해 버린 셈이 됩니다. split에 들어간 인자를 보니, '-'가 있습니다. 이것은 -을 구분자로 나누라는 것입니다.

 

 

 또 다른 예를 보겠습니다. 이번에는 ab---cd--ef로 입력을 받았는데요. 리턴된 결과값은 6개의 list로 이루어진 토큰들입니다. 3개가 리턴되어야 할 듯 하지만, 그렇지 않았습니다. 만약에, 빈 토큰이 아닌 것들만 리스트에 넣고 싶다면, 아래와 같이 처리해 주시면 됩니다.

 

 이미 토큰화된 리스트 a에서 순회를 하면서, len 값이 0이면 건너 뛰고, 그렇지 않은 것들만 출력해 주시면 됩니다. 즉, 구분자가 명시되어 있다면, 연속되는 구분자를 따로 묶지 않음을 볼 수 있어요.

 

 

 만약에 구분자 명시가 없다면 어떻게 동작할까요? 탭 문자와 스페이스 문자 여러개가 있는 string이 하나 있습니다. 그리고, 아무런 구분자도 명시하지 않았습니다. 그랬을 때에는, 그냥 white 문자를 구분자로 하게 됩니다. 출력 결과를 보면 'ab', 'cd', 'ef'가 나옴을 알 수 있습니다.

 

 

 그러면 이것은 무엇을 의미할까요? 일단, 우항의 결과가 list로 나옵니다. 이 리스트 내에 있는 변수들을 순회하면서, 차례대로 n과 m에 집어 넣겠다는 의미입니다. assignment unpacking? 여기에서는 이런 게 있네. 정도만 아셔도 무난합니다.

 

 


 문제는 여러 구분자를 기준으로 나누어야 할 때가 있습니다. 예를 들어서 +나 -를 구분자로 해야 하는 경우입니다. 이 경우에는, -를 + 문자로 바꾸는 처리를 한 다음에 +를 기준으로 나누는 방법이 있습니다.

 

 

 나쁜 방법은 아닙니다. input을 받은 문자열에서 문자 '-'를 모조리 '+'로 바꾸고, '+'를 기준으로 나눠버리면, -나 +를 구분자로 구분해 버린 것과 같기 때문입니다. 그런데, regex라는 좋은 것이 있습니다.

 

 

 우리는 +나 -를 구분자로 삼으면 되니, +, +-+, -++, ---++ 이런 것들이 나오면 이들을 구분자로 삼아버리면 됩니다. 이들이 1번 이상 나오면 되므로, 문자 집합 [+-]이 1번 이상 나오면 됩니다. 따라서 '[+-]+' 를 패턴에 입력해 주시면 됩니다.

 

 

 이렇게 작성하시면 무난하게 구분하실 수 있습니다. 더 좋은 방법은, 사실 +나 -를 구분자로 삼는다는 것이였으니, [+-]만 패턴에 넣는 것일 겁니다.

 

 

 이 패턴을 넣어도 +나 -를 구분자로 끊어버린다는 기능은 문제없이 작동함을 알 수 있습니다.

 

 

 여기서 ab, cd, ef만 가져오려면, 토큰들 중에서 길이가 0인 것들은 결과 집합에 넣지 않으면 됩니다. 파이선을 처음 접하면 어떻게 입력을 여러 개 받는지가 제일 관건입니다. 저 또한 그랬습니다. 문자열을 먼저 받고, 구분자로 나눈다는 생각을 하신다면, 쉽게 이해하실 수 있으리라 생각이 듭니다.