My Dream Being Visualized

Day 2: 백준 [7단계] 문자열 - 그룹 단어 체커 분류 본문

Algorithm

Day 2: 백준 [7단계] 문자열 - 그룹 단어 체커 분류

마틴킴 2021. 4. 8. 01:17
728x90

[결과]

 

[코드]

기록용이라, 나의 초기 구현에 대한 코드를 적어놓음. 밑에 더 좋은 코드가 있음.. 흑

이상하게 복붙이 안되서 jupyter notebook 스크린샷 떠서 첨부..

 

[과정]

1. 각 문자열 원소별 딕셔너리화를 시키면 순서를 알 수 없기 때문에 안됨.

2. 각 원소와 다른 원소가 나왔을 때 이후 길이만큼 돌면서 그 원소가 있는지 확인한다? 너무 비효율적이라고 생각이 듦.

3. 각 원소별로 딕셔너리화해서 갯수를 알아놓은다음, 인접해있는 원소의 갯수(다른 원소가 나올때까지)와 동일할 시 pass, 그렇지 않을 시 break >> 원소의 길이만큼만 for문 돌면 될 것 같다!

>> 코드의 가독성이 떨어질 것이라 판단하여 다음 건으로 변경!

4. 각 원소별로 딕셔너리화해서 갯수를 알아놓은다음, 딕셔너리의 각 키값을 문자열에서의 인덱스 번호를 알아내서, 거기서부터 다른 원소가 나올 때까지의 갯수와 같으면 나머지도 검사, 그렇지 않을 시 break! >> 원소의 길이만큼만 돌면 됨.

 

[공부]

1. class collections.Counter([iterable-or-mapping]) ref: docs.python.org/3/library/collections.html

 

collections — Container datatypes — Python 3.9.4 documentation

collections — Container datatypes Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple. namedtuple() factory f

docs.python.org

 

[문제]

www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 

[느낀점]

카운터 2개, 플래그 2개를 두니 코드가 조건문으로 너무 복잡해졌다. 미리 설계할 때에는 왜 떠오르지 않았을까?

(코드가 길고 가독성이 떨어져 굉장히 불만스러웠다.)

 

 

[선배 개발자들의 코드 분석]

다른 분들은 어떻게 구현을 하셨는지 보고나서, 충격을 먹었다.

sorted라는 함수에 key(Optional. A Function to execute to decide the order. Default is None)라는 파라미터를 넣을 수 있는지 몰랐다. 또한 그 파라미터에 word.find를 통해 문자열에서 해당 문자의 인덱스 값을 찾는 함수를 넣어줬다. 복잡한 객체를 정렬할 때, 특정 기준으로 정렬하고 싶을 때 활용하면 된다고 한다. 왜 해당 word의 문자열 기본 순서대로 뒤에 있는 값까지 가져와서 정렬해주는지에 대한 메커니즘은 잘 모르겠다..) (string.find와 string.index는 둘 다 해당하는 index 값을 리턴을 하나, find 같은 경우에 없으면 -1을 리턴하고, index는 오류를 발생시킨다.)

 

1) 변수를 하나 더 할당하지 않으려 num이라는 변수에 -=1을 했다. 나는 여러개 만들었었는데.... 2) 반복문의 시작을 1로 하여 선문자와 후문자의 인덱스 값을 비교를 했고, 만약 뒤에 중복된 게 있다면 word[j-1]이 더 클 것이기 때문에 그룹 문자가 아니라고 판단! 와우...

 

아직 진짜 멀었구나.... 부끄럽당