251016 모각코테

Ooleem·2025년 10월 16일

프로그래머스

목록 보기
1/3

1. 문자열 압축

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

쉬워보였지만 문제를 잘못 이해하기 쉬운 문제
역시 한번에 제대로 읽어야 한다
시간 아낀다고 문제 대충 읽다가 풀이방법 잘못생각해서 날리는 시간이 훨씬 많다

문제 유형 자체는 빡구현이었고, 특별한 알고리즘을 이용하는 문제는 아니었음

내가 작성한 코드 (통과)

def solution(s):
    zipped = ""
    zipped_list = []
    #snippet = []
    for i in range(1,len(s)+1):
        zipped = ""
        snippet = []
        for j in range(0, len(s), i):
            if j+i < len(s):
                if not snippet:
                    snippet.append([1, s[j:j+i]])
                else:
                    if snippet[-1][1] == s[j:j+i]:
                        snippet[-1][0] += 1
                    else:
                        snippet.append([1, s[j:j+i]])
            else:
                if not snippet:
                    snippet.append([1, s[j:]])
                else:
                    if snippet[-1][1] == s[j:]:
                        snippet[-1][0] += 1
                    else:
                        snippet.append([1, s[j:]])
        #print(snippet)
        
        for num, val in snippet:
            if num != 1:
                zipped += str(num)
            zipped += val
        zipped_list.append(zipped)
        
    return min(list(map(len, zipped_list)))
  • range 세번째 인자 이용
  • 이중 for문으로 j+i가 len(s) 넘어가면 마지막 꼬다리라고 판단
  • 바로 이전 스니펫이 같은거면 숫자 카운트, [숫자, 스니펫] 형태로 리스트에 추가하도록 함

생각보다 구현하기 까다로웠던 부분 (바로 생각 안났던거)

  • 길이 1부터 시작해서 문자열 길이까지 앞에서부터 잘라내는 작업
  • 마지막에 남은 꼬다리(?) 처리 어떻게하지 싶었음
  • 결국 if/else문으로 나눠서 구현

처음에 문제 잘못 이해했던 부분

  • 스니펫이 몇 번 등장하는지 카운트하는 딕셔너리로 접근했다가 잘못된걸 깨달음
  • 예를들어 aabbaa면 길이 1로 잘랐을때 4a2b가 아니라, 2a2b2a가 나와야함
  • 그나마 바로 알았어서 다행, 리스트의 [-1]을 이용해서 어찌저찌 다시 구현

2. 순위 검색

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

간단한듯 하면서 안 간단했던 문제
딕셔너리와 세트를 이용한 빡구현으로 해결이 되겠지 싶었지만..

내가 제출한 코드 (정확성 전부 통과 / 효율성 전부 실패)

def solution(info, query):
    dictionary = {"-":[]}
    score_only = []
    
    for i, v in enumerate(info):
        info_parsed = v.split(" ")
        for j in range(4):
            if not dictionary.get(info_parsed[j]):
                dictionary[info_parsed[j]] = [i]
            else:
                dictionary[info_parsed[j]].append(i)
        score_only.append(int(info_parsed[4]))
        dictionary["-"].append(i)
        
    #print(score_only)
    #info_parsed = [i.split(" ") for i in info]
    query_parsed = [q.split(" and ") for q in query]
    
    answer = []
    
    for q in query_parsed:
        result = set(dictionary["-"])
        soulfood, score = q.pop().split(" ")
        score = int(score)
        q.append(soulfood)
        for cond in q:
            if cond == "-":
                continue
            else:
                matched = set(dictionary[cond])
                result = set.intersection(result, matched)
        
        #print(score)
        
        answer.append(len([i for i in result if score_only[i] >= score]))
        
    return answer

추측

  • 먼저 이분탐색으로 스코어를 걸러낸 다음에 검색해야하나 싶음
  • 근데 그러면 처음에 딕셔너리 만드는 부분에서 문제가 생김 (매번 딕셔너리가 달라져야 되니까)

정답

이 문제는 2021년 카카오 신입공채 1차 코딩테스트 문제였음
https://tech.kakao.com/posts/420

3. 광고 삽입

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

실패

분명히 백준에서 비슷한 유형을 본 거 같은데.. 이건 꼭 찾아봐야겠다
이분탐색으로 푼 거 같은데..

정답

이 문제도 2021년 카카오 신입공채 1차 코딩테스트 문제였음
https://tech.kakao.com/posts/420

오늘의 후기

  • 차라리 구현하면서 미리 중간중간에 print()를 넣는건 어떨까 싶음
profile
자동기술법 블로그 (퀵메모 용도)

0개의 댓글