개발자 톡

연습문제 톡 [HSAT 6회 정기 코딩 인증평가 기출] 염기서열 커버

11개 테스트케이스 오답으로 나와요.. 예제 부탁드려요 ㅠㅠ

등록일
2024-02-14 19:16:34
조회수
587
작성자
ellie19981008

제목대로 테스트케이스 11개가 오답으로 처리됩니다.. 시간초과는 아니구요! 아래코드는 간단한 주석을 달고 올립니다. 고수님들 부탁 드립니다..

개발자톡에서 몇몇분이 올려주신 엣지케이스들은 통과가 되고 있어요.. ! 제 코드에 해당될 것 같은 반례나, 개선점 제안 부탁 드립니다!


import sys
#초기 n,m값 받기
n, m = map(int, sys.stdin.readline().split())


def solution(n,m):


    #염기서열 입력값 저장
    initial = []
    for _ in range(n):
        line = sys.stdin.readline().rstrip()
        if len(line) == m:
            initial.append(line)


    #복잡한 아이들 찾기 (알파벳 많이 들어갈 수록 복잡하다) --> 알파벳 포함된 갯수가 dict의 key, 해당 문자열은 list화 된 value로 저장.
    tmp = {}
    for elem in initial:
        count = 0
        for i in range(m):
            if elem[i] != '.':
                count += 1
        if count not in tmp.keys():
            tmp[count] = [elem]
        else:
            tmp[count].append(elem)
            
    #복잡한 순서대로 사전을 정렬 (dict의 key가 클 수록 복잡하다)
    sorted_dict = dict(sorted(tmp.items(), key=lambda x: x[0], reverse=True))


    #복잡한 순서대로 정렬된 아이들을 하나의 list로 통합
    lines = []
    for key, value in sorted_dict.items():
        lines.extend(value)


    #복잡한 순서대로 정렬한 list를 앞에서부터 하나씩 제거해가며 다른애들과 비교한다. 비교해서 문제없을 시, 해당 다른 아이도 삭제한다.
    s = None
    answer = 0
    while len(lines) > 0:
        s = lines.pop(0)
        answer += 1
        
        need_to_delete = []
        for i in range(len(lines)):
            same = True
            for j in range(m):
                if s[j] != '.' and lines[i][j] != '.' and s[j] != lines[i][j]:
                    same = False
            if same == True:
                need_to_delete.append(lines[i])
    
        for value in need_to_delete:
            lines.remove(value)
    return answer


# n,m 이 제대로 주어지지 않을시를 대비하여 ...
if n>0 and m>0:
    print(solution(n,m))
#[HSAT_6회_정기_코딩_인증평가_기출]_염기서열_커버
#염기서열.기출.기출문제.염기서열_커버

이 카테고리의 톡 더보기