daniel7481의 개발일지

[프로그래머스]2020 KAKAO BLIND RECRUITMENT - 문자열 압축 본문

BOJ

[프로그래머스]2020 KAKAO BLIND RECRUITMENT - 문자열 압축

daniel7481 2022. 7. 11. 18:40
반응형

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

 

프로그래머스

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

programmers.co.kr

프로그래머스에 스킬체크라는게 생겼다. 굿 스타터부터 알고리즘 마스터까지 다양한 시험이 준비되어 있었다. 탄탄한 비기너 시험을 보았고 90점을 맞았다. 문제는 공개하면 안되기 때문에 따로 포스팅하지는 않겠다. 코딩 테스트를 대신하여 풀기 괜찮은 것 같다. 한번씩 풀어보길 바란다. 코테를 준비하며 BOJ만 풀 것이 아니라 코테 문제를 많이 제공하는 프로그래머스도 풀어봐야 할 것 같아서 오랜만에 프로그래머스에 들어갔다. 레벨1~2 사이의 문제를 풀어볼려고 했고, 이 문제를 보고 난 후 이상하리만치 헤맸다...ㅠㅠ 어쨌든 문제를 읽어보면 결국 주어진 문자열을 단락으로 나누어 비교를 해야했기 때문에, 비교할 수 있는 길이는 len(s)//2밖에 되지 않겠다. 이보다 크면 대칭이 깨지기 때문이다. i는 비교하는 토큰의 크기로 설정하고, j는 문자열 s에서 i만큼 나눈 단락을 몇 번 탐색할 것인지 설정하였다. 나는 일단 비교할 문자열 compare, 부분 문자열을 더해주어 마지막에 완성시킬 문자열 sentence, 만약 한 문자열이 반복되어 있으면 카운트를 해줄 카운터 repeat을 선언하였다. 그 다음 탐색을 하며 만약 다음에 나올 단락이 현재 compare이랑 다르다면, 만약 repeat이 1보다 크다면(두 번 이상 반복되어있다면) sentence에 repeat을 문자열 형으로 더해주고, compare을 더해준 후, compare 문자열을 다음 단락의 문자열로 바꿔주었다. 만약 repeat이 1이라면 repeat을 더해줄 필요는 없다(문제에서 생략 가능하다고 나와있다).. 여기서 나는 마지막 탐색에서 남은 문자열을 어떻게 해줄 지 마땅한 방법이 생각나지 않아, 단순히 j가 마지막 탐색일 시에는 남은 compare을 더해주기로 하였다. 또한 i가 1씩 증가하면서 돌 떄 만약 문자열의 길이가 i에 대하여 나머지가 0이 아닐 경우 비교 자체를 안하게 되어있었다, 그러므로 만약 len(s)%i != 0일 시에는 s[len(s)%i:]로 문자열의 남은 부분을 더해주었다. 마지막으로 완성된 sentence의 길이가 answer보다 적다면 더 작은 길이가 완성된 것이므로 할당해주었다. 개인적으로 코드가 너무 더러워서 마음이 아팠지만 인덱스에서 한참을 헤맸더니 머리가 어질어질해서 작금은 신경 쓸 여력이 없다.. 여러분은 다른 분의 코드를 참고하길 바란다.ㅠ

import sys
input = lambda: sys.stdin.readline().rstrip()
def solution(s):
    answer = 1e9
    for i in range(1, len(s)//2+1):
        compare = s[:i]
        sentence = ""
        repeat = 1
        for j in range(1, len(s)//i):
            if compare != s[j*i:j*i+i]:
                if repeat != 1:
                    sentence += str(repeat)
                    repeat = 1
                    sentence += compare
                    compare = s[j*i:j*i+i]
                else:
                    sentence += compare
                    compare = s[j*i:j*i+i]
                if j == len(s)//i-1:
                    sentence += compare
            else:
                repeat += 1
                if j == len(s)//i-1:
                    sentence += str(repeat)
                    sentence += compare
        if len(s) % i != 0:
            sentence += s[-(len(s)%i):]
        if answer > len(sentence):
            answer = len(sentence)
    return answer
print(solution("a"))
반응형

'BOJ' 카테고리의 다른 글

[BOJ]2234 성곽  (0) 2022.07.15
[BOJ]18428 감시 피하기  (0) 2022.07.14
[BOJ] 2174 로봇 시뮬레이션  (0) 2022.07.08
[BOJ]1935 후위표기식2  (0) 2022.07.08
[BOJ]1918 후위 표기식  (0) 2022.07.08