알고리즘

[프로그래머스] LV1. 문자열 나누기

j9972 2023. 3. 9. 15:44
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

접근

1. while 문을 통해서 for문을 돌려서 첫번째 값과 같은지 다른지에 따라서 same과 diff값을 증가시키고 same == diff가 되는 순간에 s의 모양을 변화시키고, ans와 idx 를 증가시키는 방법을 사용했지만 런타임 에러가 뜬다

 

2. 내가 생각 못한점 

- s의 길이가 1개일때,, 눈물의 테케 31번 진짜 ㅡㅡ 런타임 에러 계속 나서 짜증 났네,,

- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다. ( same != diff 인 상황도 가능 하다 )

 

 

풀이

1차 풀이 ( 실패한 코드 -> 런타임 에러 7개 테스트 정도 )

def solution(s):
    ans = 0
    idx = 1
    same = 1
    diff = 0
    x = s[0]
    
    while True:
        if x == s[idx]:
            same += 1
            idx += 1
        else:
            diff += 1
            idx += 1
        
        if same == diff:
            ans += 1
            if len(s[idx:]) >= 2:
                s = s[idx:]
                x = s[0]
                same = 1
                diff = 0
            elif len(s[idx:]) == 1:
                ans += 1 
                break
            else:
                break
            idx = 1
    
    return ans

 

2차 코드

import sys
sys.setrecursionlimit(10000)
def solution(s):
    ans = 0
    idx = 1
    same = 1
    diff = 0
    x = s[0]
    
    if len(s) == 1:
        return 1
    
    while True:
        if x == s[idx]:
            same += 1
            idx += 1
        else:
            diff += 1
            idx += 1
        
        if same == diff:
            ans += 1
            if len(s[idx:]) >= 2:
                s = s[idx:]
                x = s[0]
                same = 1
                diff = 0
            elif len(s[idx:]) == 1:
                ans += 1 
                break
            else:
                break
            idx = 1
        elif same != diff:
            if len(s[idx:]) == 0:
                break
            elif len(s[idx:]) == 1:
                ans += 1
                break
    
    return ans

 

해내버렸다,,,