NIRVANA

[level 1] 문자열 나누기 본문

Coding test(Python3)/Programmers

[level 1] 문자열 나누기

녜잉 2023. 9. 3. 15:08

문제

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

 

문제 풀이 접근법1

1) 문자열의 첫번째 원소를 stand로 정의한다.

2) 만약 stand와 s의 각 원소가 같다면 same에 +1을 하고, 서로 다르다면 differ에 +1을 해준다.

3) 만약 same과 differ이 같다면 answer에 +1을 한다.

4) 만약 s의 길이가 짝수이면 현재 원소를 stand값으로 정의하고, 길이가 홀수이면 i+1(즉, 다음 값)을 stand로 정의한다.

5) 만약 i+1의 값이 마지막 값이라면 answer에 +1을 해준다.

def solution(s):
    answer = 0
    same, differ = 0, 0
    
    stand = s[0]

    for i in range(len(s)):
    
        if stand == s[i]:
            same += 1
        else:
            differ +=1
    
        if same == differ:
            answer +=1
            if len(s) % 2 == 0:
                stand = s[i]
            else:
                stand = s[i+1]
            
                if i+1 == len(s) -1:
                    answer +=1
    
    return answer

테스트 케이스 2, 5, 6, 8, 9, 11, 13, 14, 15, 21, 23, 24, 27, 28, 29, 30, 32, 33을 제외하고 실패했다..ㅎ

아무래도 5번이랑 6번에서 논리가 빈약하니까 그럴 수 밖에 없겟지..

 

 

문제 풀이 접근법2

문제점을 드디어 알았다.  differ와 same이 같아진 시점 다음 원소를 stand로 정해야 하는데 그걸 위의 코드처럼 맨 마지막에 두고 한다면 i+1을 해줘야 했다. 그런데 그러면 문제는 나중에 index out of range 에러가 발생함...

해결법은 맨 처음에 differ와 same이 같은지 확인한 후, 현재의 원소를 stand로 정하는 거였다. 

그러면 그 전에 differ와 same이 같아진 상태이고, 다음 턴에서 differ와 same이 같은지 확인 한 뒤에 현재 i(differ와 same이 같아진 i 바로 다음 원소가 됨)를 stand로 설정하면 깔-끔하게 완료된다..

def solution(s):
    same, differ = 0, 0
    answer = 0
    stand = s[0]


    for i in range(len(s)):
    
        if same == differ:
            answer +=1
            stand  = s[i]
            differ, same = 0, 0
    
        if stand == s[i]:
            same += 1
        else:
            differ +=1
        
    return answer

 

 

 


하 이렇게 간단한걸로..

구라 안치고 이틀 동안 고민함....

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[level 1] 크레인 인형뽑기 게임  (0) 2023.09.04
[level 1] 대충 만든 자판  (1) 2023.09.03
[level 1] 완주하지 못한 선수  (0) 2023.08.30
[level 1] 체육복  (0) 2023.08.30
[level 1] 숫자 짝꿍  (0) 2023.08.30