이번 시간에는 파이썬에서 구분자가 여러개일 때 split를 어떻게 쓰는지 알아봅시다.

 


 문자열이 주어질 때, ,이나 $이나 .이 오면 이것을 구분자로 취해야 합니다. 예를 들어서, 예시 문자열은 123,..,4$567alpha일 때, split를 한 결과는 123, 4, 567alpha 순서대로 나와야 합니다. 단순하게, split만 쓰기 위해서는 구분자들을 하나의 구분자로 통일시키기만 하면 됩니다. 이 패턴은 실무에서 문자열 처리 할 때 자주 쓰이는지는 모르겠습니다. 그러나, 딩 테스트에서는 심심찮게 쓰이는 스킬이므로 알아두시면 도움이 매우 많이 됩니다.

 

 플로우를 볼까요? .과 ,과 $를 기준으로 분리하라고 했는데요. 이런 문제를 multiple delimeter라고 해요. 구분자다. 라는 정보가 사라지지 않으면서, 압축시키는 방법은 뭐가 있을까요? 다른 구분자들을 하나의 구분자로 바꾸는 것입니다. 예를 들자면 .과 $를 구분자 쉼표로 바꾸는 것입니다.

 

 

 그러면, $이나 .은 ,으로 바뀌었을 것이니, 그 다음에는 ,을 구분자로 해서 분리하면 끝납니다.

 

 

 간단해 보이네요. 실제로 구분자가 얼마 없을 경우에는, 구분자를 하나로 통합하고 split를 하는 것이 보다 간단한 방법입니다. 실행 결과를 보겠습니다.

 

 

 잘 나왔네요. 그런데, 구분자가 한글이라면 어떨까요? 혹은 3000개라면 어떨까요? 이런 식으로 했다가는 뼈도 못 추릴 거 같습니다.

 


 이럴 때 쓸 수 있는 것은 regex 모듈인 re입니다. 이 모듈 안에도 split가 있는데요. 설명을 보면 1번째 인자에 패턴을 넣으라고 되어 있어요. 2번째 인자에는 분리할 target string을 넣습니다.

 

 regex가 들어가면 그냥 깡 split을 하는 것 보다는 꽤 강력한 기능을 제공하는데요. 예를 들어서, 대소문자를 구분자로 하게 하거나, 혹은 한글을 구분자로 하는 식으로 응용이 가능합니다.

 

 

 패턴이 [,.$]이라면, 문자 ,이나 .이거나 $을 구분자로 하겠다는 의미입니다. 실행 결과를 보겠습니다.

 

 123, 4, 567alpha가 나오네요. 문제는 빈 문자열이 나오는 경우가 있다는 것인데요. 예제의 결과에 빈 문자열이 나온 직후에 새줄 문자가 나온 것 같은 느낌이 든 것은 기분 탓이 아닙니다. 간단한 처리로 공백을 결과물에서 제거할 수 있습니다.

 

 4번째 줄에, if not tar가 있습니다. 이는, tar가 빈 문자열이면 참이 되게 됩니다. 이 점을 이용해서, empty string이 나오는 경우를 걸러내 주시면 되겠습니다.

 

 

 아까와는 다르게 의도한 대로 잘 나오네요. 패턴을 [,.$]+ 이렇게 적고 빈 문자열 처리를 안 해도 될 거 같지만 그것은 아닙니다. 그렇게 하는 경우에는 여전히 결과값의 중간에 빈 문자열이 나오게 할 수 있어요.

 


 백준 2870번 문제를 봅시다. 이것은 문자열 속에서 수를 찾아내야 하는데요. 무엇을 기준으로 분리해야 할까요? 숫자가 아닌 것을 기준으로 분리하면 됩니다.

 

 

 조금 복잡해 보이지만, 사실 별 게 없습니다. 4번째 줄에, re의 split 패턴을 [^0-9]라고 적어 놓았는데요. 이것은 숫자가 아닌 문자 하나 이상이 연속된 패턴을 구분자로 삼겠다는 것입니다. 1번째 문자열에서는 silos가 delimeter가 될 겁니다. 다음에, if절 뒤에 있는 것은 필터링 조건인데요. if k이기 때문에 빈 문자열인 경우를 거르게 됩니다.

 

 for절 앞에 있는 int(k) 때문에, ret에는 정수가 저장되게 됩니다.

 

 실행 결과는 위와 같습니다. 정렬하고 중복 처리하는 것만 하면 2870번을 푸실 수 있습니다. 아주 간단하게요.