문제

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

풀이

시도 1

문자열 길이가 1백만이기 때문에 예외처리를 먼저 진행해야한다.

  1. 전체 길이가 홀수면 나눠질 수 없음
  2. 문자열의 각 알파벳 갯수가 홀수 이면 나눠질 수 없음
  3. 전체길이가 알파벳 종류 갯수의 약수가 아니면 나눠질 수 없음

55.2점으로 탈락

solution.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def solution(s):
    length = len(s)
    # 홀수 이면 나눠질 수 없음
    if length % 2 == 1:
        return 0

    # 문자열의 각 알파벳의 갯수가 홀수 이면 나눠질 수 없음
    alpha = []
    for i in s:
        if i not in alpha:
            alpha.append(i)
    for i in alpha:
        if s.count(i) % 2 == 1:
            return 0

    # 전체길이가 알파벳 종류 갯수의 약수가 아니면 나눠질 수 없음
    if length % len(alpha) != 0:
        return 0

    # 알파벳 종류만큼 돌면서
    for i in range(len(alpha)):
        for a in alpha:
            # 문자열에 연속되는 알파벳이 있으면 삭제해줌
            s = s.replace(a+a,'')
            # 문자열이 비었으면 성공
            if s == '':
                return 1

    return 0

    # while True:

시도 2

스택 사용하여 알파벳을 스택에 넣으면서 이전값과 같으면 팝, 다르면 푸쉬하여 스택이 비어져있으면 1을 리턴한다

solution.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def solution(s):
    stack = []
    for i in range(len(s)):
        # print(stack)
        if not stack:
            stack.append(s[i])
        else:
            if s[i] == stack[-1]:
                stack.pop()
            else:
                stack.append(s[i])
    if stack:
        return 0
    else:
        return 1


다른사람 풀이

스택이 있는지 없는지를 판별해 리턴할때 한줄로 return not(stack)으로 표시가 가능

1
2
    ...
    return not(stack)