본문 바로가기
코딩테스트/구현

<PART 3> Q9.프로그래머스 2020 KAKAO BLIND RECRUITMENT 문자열 압축

by brown_board 2022. 11. 15.
728x90

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

 

프로그래머스

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

programmers.co.kr

 

- input.txt파일 만들었을 때 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import sys
 
sys.stdin = open('input.txt')
 
def solution(s):
    # 문자열 s이 최솟값
    answer = len(s)
    result = []
    #완전 탐색
    #압축은 전체 문자열을 2로 나눈 몫까지만 가능
    for steps in range(1len(s)//2+1):
        #1~몫까지 문자열 나누기.
        lst = [s[j:j+steps] for j in range(0len(s), steps)]
        #문자열 넣을 빈리스트 생성
        array = []
        #중복생길때마다 2부터 시작하므로 1로 초기화
        count = 1
        #쪼개진 문자열에서 다음 문자열과 같은지 비교
        for i in range(len(lst)):
            #첫 인덱스를 저장
            tmp = lst[i]
            #중복이 생겼다면 그만큼 통과
            if count != 1:
                count -= 1
                continue
            count = 1
            for j in range(len(lst)):
                # 지금이 다음 문자열과 비교 or 지금이 마지막 문자열일때 다음것이 없으므로 추가.
                if i < j or i == len(lst) -1:
                    if lst[i] != lst[j]: #다음 문자열이랑 비교해서 다르다면
                        if count == 1:
                            array.append(tmp)
                        else:
                            array.append(str(count)+tmp)
                        break
                    else#다음 문자열과 같다면
                        count +=1
                        if j == len(lst)-1:
                            array.append(str(count)+tmp)
        result.append("".join(array))
    for idx in range(len(result)):
        answer = min(len(result[idx]),answer)
    return answer
 
for test in range(5):
    s = input()
    print(solution(s))
cs

 

- 제출용 코드

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
32
33
34
35
36
37
38
39
def solution(s):
    # 문자열 s이 최솟값
    answer = len(s)
    result = []
    #완전 탐색
    #압축은 전체 문자열을 2로 나눈 몫까지만 가능
    for steps in range(1len(s)//2+1):
        #1~몫까지 문자열 나누기.
        lst = [s[j:j+steps] for j in range(0len(s), steps)]
        #문자열 넣을 빈리스트 생성
        array = []
        #중복생길때마다 2부터 시작하므로 1로 초기화
        count = 1
        #쪼개진 문자열에서 다음 문자열과 같은지 비교
        for i in range(len(lst)):
            #첫 인덱스를 저장
            tmp = lst[i]
            #중복이 생겼다면 그만큼 통과
            if count != 1:
                count -= 1
                continue
            count = 1
            for j in range(len(lst)):
                # 지금이 다음 문자열과 비교 or 지금이 마지막 문자열일때 다음것이 없으므로 추가.
                if i < j or i == len(lst) -1:
                    if lst[i] != lst[j]: #다음 문자열이랑 비교해서 다르다면
                        if count == 1:
                            array.append(tmp)
                        else:
                            array.append(str(count)+tmp)
                        break
                    else#다음 문자열과 같다면
                        count +=1
                        if j == len(lst)-1:
                            array.append(str(count)+tmp)
        result.append("".join(array))
    for idx in range(len(result)):
        answer = min(len(result[idx]),answer)
    return answer
cs

풀이: 문자열을 먼저 len(s)//2 +1로 차례대로 나눕니다. 그 후에 처음 인덱스부터 끝까지 중복인지 아닌지 찾고 문제에서 주어지는 대로 문자열로 나타내서 result에 추가시킵니다. 나눈 문자열을 전부 실행다시키면 result 중에서 문자열 길이의 최솟값을 다 구합니다.

배운점: 진짜 오래 걸려서 푼 문제다. 나누는 것까지는 했지만 중복된것을 찾고 테스트케이스에 맞는 모든 케이스를 해결한다고 오래걸렸다. 다른 사람들의 풀이를 보면 내것보다 훨씬 짧다. 그렇지만 내 코드는 그 대신에 직관전이라고 생각한다. 문자열의 길이를 나눌 때 컴프레션 표현으로 나타내는 것이 좋다고 생각한다.

728x90

댓글