[문제] 스킬트리

이동규 (Justin)·2020년 6월 19일
0

하루종일 이거 한문제 풀었다. ㅋㅋㅋ

def solution(skill, skill_trees):
    answer = 0
    skill = ''.join(reversed(skill))
    
    
    for i in skill_trees:
        for j,v in enumerate(skill):
            if v in i:
                k=j+1
                while k < len(skill):
                    if not (skill[k] in i) or (i.index(skill[k]) > i.index(v)):
                        break
                    v = skill[k]                        
                    k += 1
                else:
                    answer += 1
                # 일단 스킬 중 하나라도 발견했다면 선행스킬들이 제자리에 있어서 답중 하나로 추가되거나 아니면 중간에 break 되거나 둘중 하나로든 끝나고 나면 그 후에는 nested for loop을 break 하는 것이 맞다.
                break
        # 명시된 스킬중 하나도 없는경우
        else:
            answer += 1
    
    return answer

if not (skill[k] in i) or 부분을 추가하는 것이 크리티컬했다.

예를 들어 선행이 C-B-D 인 상황에서 D 가 있어도 B나 C가 아예 없는 스킬트리의 경우가 있기 때문에, 먼저 B와 D의 인덱스를 비교하기 전에 B가 i 안에 존재하는지를 확인했어야 했고 그걸 제대로 표현해내어야 했다.

조금 더 일반화시켜보자면 일단 위와 같은 반례 케이스에 대해 충분히 열어두고 생각하지 못했고 내 코드에 어떤 실수가 있을거라는 생각 (자신감부족) 때문에 시간을 많이 버렸다.

또 해당 반례를 어렴풋이 알았더라도 if문의 조건으로 정확하게 표현해내지 못했다.

다시 정리해보면 문제는 크게 세가지? 정도다.

  • 명확한 논리구조를 생각하는 것 (a일 때 b로 가고, a가 아닐 때 c로 가고..)
  • 해당 논리구조를 코드로 정확하게 표현해내는 것
  • 반례에 대해 열어두고 조건을 그에 맞추어 (정확하게) 수정하는 것

마지막으로 느낀점

  • 과감하게 지우고 개념을 명확하게 해가면서 다시 코딩하는게 좋은 것 같다.
  • 연습장과 펜은 필수다. 머리로만 할 수 없다.

하루종일 한문제 풀었더라도 해냈다는 성취감이 크다. 포기하고 답을 봤더라면 하나도 제대로 얻을 수 없었을거다. 고민하고 풀어내길 잘했다. 다만 더 성장해서 이러한 과정을 짧은 시간 내에 가능하게 만드는 것이 나의 목표가 되겠다. 집중하는 연습도 해야겠다.

나는 왜 이렇게 풀지 못했나..

def solution(skill,skill_tree):
    answer=0
    for i in skill_tree:
        skillist=''
        for z in i:
            if z in skill:
                skillist+=z
        if skillist==skill[0:len(skillist)]:
            answer+=1
    return answer

뒤에서부터 확인한다는 쓸데없는 상상력을 발휘하지 않았어도 괜찮았을 것 같다.

profile
Frontend Developer, JamStack, Ethereum

0개의 댓글