하루종일 이거 한문제 풀었다. ㅋㅋㅋ
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문의 조건으로 정확하게 표현해내지 못했다.
다시 정리해보면 문제는 크게 세가지? 정도다.
마지막으로 느낀점
하루종일 한문제 풀었더라도 해냈다는 성취감이 크다. 포기하고 답을 봤더라면 하나도 제대로 얻을 수 없었을거다. 고민하고 풀어내길 잘했다. 다만 더 성장해서 이러한 과정을 짧은 시간 내에 가능하게 만드는 것이 나의 목표가 되겠다. 집중하는 연습도 해야겠다.
나는 왜 이렇게 풀지 못했나..
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
뒤에서부터 확인한다는 쓸데없는 상상력을 발휘하지 않았어도 괜찮았을 것 같다.