[Programmers] Lv1 문자열 나누기 Java

2023. 2. 7. 05:55CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

문제를 풀때 same 과 diff 즉 같을 때랑 다를 때를 계산해서 풀어야 한다.

하지만 same과 diff의 갯수가 같은지를 확인하는 거 보다 변수 하나를 통하여 제어 가능하므로 하나를 쓰는 것이 좋다.

방법은 다음과 같다.

같은 것이 있다면 sadi 변수에 1을 더한다.

다르다면 sadi 변수에 1을 뺀다.

갯수가 같다면 0이 되므로 same, diff 두개를 하나의 변수로 변환해서 사용이 가능하다.

sadi += (s.charAt(start) == s.charAt(i)) ? 1 : -1;

sadi가 0이라면 정답인 answer을 증가 시키고 start 즉 비교하려는 대상자를 변경한다.

마지막 인덱스의 경우에 overflow가 발생할 수 있으므로 이에 대한 코드도 추가해줘야 한다. 이후 위에 코드와 아래 코드를 적절히 반복문을 이용하면 문자열 나누기 문제를 풀 수 있다.

if (sadi == 0) {
    answer++;
    start = i + 1;
    if (start == s.length())
        break;
}

아래는 same과 diff 둘다 쓴 경우와 sadi 하나로 쓴 경우를 비교 했을때 tset 결과를 본 것이다. 대부분의 경우 변수하나로 제어했을때 속도가 빨랐다.

 

  same diff 둘다 쓴 경우 sadi 하나로 쓴경우
테스트 1 〉 통과 (0.03ms, 75.1MB) 통과 (0.02ms, 73.5MB)
테스트 2 〉 통과 (0.44ms, 66.4MB) 통과 (0.41ms, 69.9MB)
테스트 3 〉 통과 (1.09ms, 78.8MB) 통과 (0.71ms, 69.9MB)
테스트 4 〉 통과 (0.03ms, 68.5MB) 통과 (0.02ms, 76.8MB)
테스트 5 〉 통과 (0.04ms, 74.6MB) 통과 (0.02ms, 74.3MB)
테스트 6 〉 통과 (0.03ms, 73.3MB) 통과 (0.02ms, 82.1MB)
테스트 7 〉 통과 (0.02ms, 80.7MB) 통과 (0.03ms, 76.3MB)
테스트 8 〉 통과 (0.03ms, 74.8MB) 통과 (0.02ms, 75.1MB)
테스트 9 〉 통과 (0.35ms, 75.6MB) 통과 (0.44ms, 79.4MB)
테스트 10 〉 통과 (0.80ms, 68.2MB) 통과 (0.60ms, 75.3MB)
테스트 11 〉 통과 (0.30ms, 74.4MB) 통과 (0.20ms, 75MB)
테스트 12 〉 통과 (0.51ms, 79.3MB) 통과 (0.47ms, 76.3MB)
테스트 13 〉 통과 (1.08ms, 68.4MB) 통과 (0.86ms, 74.2MB)
테스트 14 〉 통과 (1.20ms, 75.2MB) 통과 (1.22ms, 72.5MB)
테스트 15 〉 통과 (0.22ms, 74.7MB) 통과 (0.29ms, 72.3MB)
테스트 16 〉 통과 (1.18ms, 68.2MB) 통과 (0.78ms, 74.6MB)
테스트 17 〉 통과 (0.40ms, 76.7MB) 통과 (0.38ms, 68.6MB)
테스트 18 〉 통과 (0.73ms, 73.4MB) 통과 (0.68ms, 77MB)
테스트 19 〉 통과 (0.47ms, 72.9MB) 통과 (0.45ms, 69.8MB)
테스트 20 〉 통과 (0.85ms, 74.7MB) 통과 (0.75ms, 91.5MB)
테스트 21 〉 통과 (0.92ms, 75.6MB) 통과 (0.85ms, 84.7MB)
테스트 22 〉 통과 (0.55ms, 72.1MB) 통과 (0.52ms, 85.3MB)
테스트 23 〉 통과 (0.35ms, 70.3MB) 통과 (0.32ms, 83.1MB)
테스트 24 〉 통과 (0.53ms, 74MB) 통과 (0.34ms, 78.2MB)
테스트 25 〉 통과 (0.90ms, 78MB) 통과 (0.85ms, 79.8MB)
테스트 26 〉 통과 (1.17ms, 80MB) 통과 (0.73ms, 75.6MB)
테스트 27 〉 통과 (0.83ms, 75.6MB) 통과 (0.64ms, 72.5MB)
테스트 28 〉 통과 (0.44ms, 73.7MB) 통과 (0.60ms, 75.9MB)
테스트 29 〉 통과 (0.94ms, 77MB) 통과 (0.89ms, 73.3MB)
테스트 30 〉 통과 (0.48ms, 67.7MB) 통과 (0.51ms, 75.9MB)
테스트 31 〉 통과 (0.03ms, 70.2MB) 통과 (0.02ms, 75.8MB)
테스트 32 〉 통과 (0.04ms, 76.6MB) 통과 (0.04ms, 77.4MB)
테스트 33 〉 통과 (0.03ms, 83MB) 통과 (0.02ms, 75.3MB)
테스트 34 〉 통과 (0.04ms, 76.9MB) 통과 (0.03ms, 68.7MB)
테스트 35 〉 통과 (0.04ms, 76.8MB) 통과 (0.03ms, 76.4MB)
테스트 36 〉 통과 (0.03ms, 72.6MB) 통과 (0.02ms, 75.4MB)
테스트 37 〉 통과 (0.04ms, 77.1MB) 통과 (0.03ms, 75.7MB)
테스트 38 〉 통과 (0.03ms, 73.5MB) 통과 (0.03ms, 72.9MB)
테스트 39 〉 통과 (0.04ms, 65.6MB) 통과 (0.03ms, 82.2MB)
테스트 40 〉 통과 (0.04ms, 75.5MB) 통과 (0.04ms, 78MB)
테스트 41 〉 통과 (1.45ms, 74.9MB) 통과 (1.37ms, 85.1MB)
테스트 42 〉 통과 (1.35ms, 73.3MB) 통과 (0.86ms, 78.2MB)

 

소스 코드

public class Solution {

    public int solution(String s) {
        int answer = 0, start = 0, sadi = 0;

        for (int i = 0; i < s.length(); i++) {
            if (sadi == 0) {
                answer++;
                start = i + 1;
                if (start == s.length())
                    break;
            }
            sadi += (s.charAt(start) == s.charAt(i)) ? 1 : -1;
        }

        return answer;
    }
}
728x90