이 험난한 세상에서어어~

문자열 나누기 본문

algorithm/코딩 테스트

문자열 나누기

토끼띠NJW 2023. 6. 26. 11:34

문제 설명

문제를 처음 봤을 때는 이해하기 어려울 수 있으나 찬찬히 보면 꽤 쉬운 문제다.

1. 일단 맨 처음 문자를 x로 잡는다.

2. 그리고 문자열을 돌면서 x와 같은 문자와 다른 문자의 수를 센다.

3. 그렇게 센 값들이 같아지면 문자열을 분리하고 그 다음 문자를 1부터 반복한다.

설명만 보면 어려울 수 있으나 코드를 보면 이해하기가 훨씬 쉬울 것이다.

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

첫 번째 풀이

일단  x에다가 첫 번째 문자를 넣어준다. 그리고 countX에는 1을 countOther에는 0을 넣어준다. countX는 x와 같은 문자를 세는 변수이고 countOther은 x와 다른 문자를 세는 변수이다. 그리고 이 두 변수가 같으면 answer을 하나 올려주고 두 개의 변수를 0으로 처리한다. 다음 x를 갱신해줘야 하는데, 여기서 중요한 것은 끝난 문자 다음 문자부터 시작해야 하니 s[i+1]을 넣어야 한다는 것이다. 다만, 인덱스의 범위를 넘을 것이 분명하기에 i != len(s)-1을 넣어서 문제가 발생하지 않도록 한다.

 

그렇다면 여기서 드는 의문. 만일 countX와 countOther이 같지 않은 상태로 끝났을 때 그 나머지 문자열은 어떻게 구분을 해줘야 하나?

여기서 나는 어느 정도 고민을 했는데, 나의 코드에서 힌드를 얻어서 풀이를 했다. 나는 countX와 countOther이 같을 때 두 변수를 0으로 만들도록 했다. 그러면 countX와 countOther이 같지 않은 상태로, 즉 맨 뒤에 문자열이 남을 상태로 끝났다면 적어도 둘 중 하나는 0이 아니지 않을까?

그래서 반복문을 끝내고 둘 중 하나라도 0이 아니면 answer에 1을 더해주도록 했다. 그래서 정답!

코드

python

def solution(s):
    answer = 0
    # 맨 처음 나온 글자를 x
    # x와 x가 아닌 글자의 수를 세서 비교한다.
    # 같아지면 해당 문자열을 분리하고 다시 처음부터 반복
    x = s[0]
    countX = 1
    countOther = 0
    
    for i in range(1, len(s)):
        if x == s[i]:
            countX += 1
        else:
            countOther += 1
        if countX == countOther:
            answer += 1
            countX = 0
            countOther = 0
            if i != len(s)-1:
                x = s[i+1]
    
    if countX != 0 or countOther != 0:
        # print("이 부분")
        answer += 1
    
                        
    return answer

java

class Solution {
    public int solution(String s) {
        int answer = 0;
        char x = s.charAt(0);
        int countX = 1;
        int countOther = 0;
        
        for(int i = 1; i<s.length(); i++){
            if(x == s.charAt(i)){
                countX++;
            }else{
                countOther++;
            }
            if(countX == countOther){
                answer++;
                countX = 0;
                countOther = 0;
                if(i != s.length()-1){
                    x = s.charAt(i+1);
                }
            }
        }
        
        if(countX != 0 || countOther != 0){
            answer++;
        }
            
        
        return answer;
    }
}

'algorithm > 코딩 테스트' 카테고리의 다른 글

해킹  (0) 2023.06.26
달리기 경주  (0) 2023.06.26
대충 만든 자판  (0) 2023.06.26
주차 요금 계산  (0) 2023.06.23
컨베이어 벨트 위의 로봇  (0) 2023.06.22