n=input()
n=[x for x in n]
flag=True
for i in reversed(range(len(n))):
if n[i]!="h" and n[i]!="e" and n[i]!="l" and n[i]!="o":
del n[i]
def ans(n):
global x,y,z,w,flag
x=-1
y=-1
z=-1
w=-1
for j in range(len(n)):
if n[j]=="h":
x=j
break
else:
continue
if x==-1 or x>len(n)-5:
return False
for k in range(x+1,len(n)):
if n[k]=="e":
y=k
break
else:
continue
if y==-1 or y>len(n)-4:
return False
for l in range(y+1,len(n)):
if n[l]=="l":
z=l
break
else:
continue
if z==-1 or z>len(n)-3:
return False
for f in range(z+1,len(n)):
if n[f]=="l":
w=f
break
else:
continue
if w==-1 or w>len(n)-2:
return False
for r in range(w+1,len(n)):
if n[r]=="o":
break
elif r<len(n)-1:
continue
else:
return False
return True
if ans(n):
print("YES")
else:
print("NO")` `
문자를 인풋받고 적절한 인덱스의 문자를 제거한 후에 "hello"가 출력될수 있는지 묻는 문제다.
hello가 출력되려면 우선 h, e, l, o가 아닌 문자는 모두 제거 해 줘야한다. reversed 함수 이용
제거 할 때는 del 을 이용할 것이기 때문에 역순으로 for문을 돌린다. (앞의 문자가 먼저 삭제되면
리스트의 인덱스가 달라지기 때문)
어떻게하면 hello라는 문자열만 남기고 if n=="hello"로 판별할까 고민을 정말 많이 한 문제다.
결론은, 그렇게 푸는게 아니였다. 문제에서 요구하는 것만 하면 된다는 과거의 기억이 떠올랐다.
문제에서 요구하는데로 문자를 제거하지 않더라도 hello를 찾기만 하면 되는 것이다.
나는 함수를 만들고 flag bool변수를 이용해서 h다음에 e다음에 l 다음에 l 다음에
o가 오는지 판별했고 그 과정중 하나라도 만족시키지 못하면 flag를 False로 리턴하였다.
결론적으로 flag에 따라 답이 YES와 NO로 나뉘는 쉬운 문제라고 볼 수도 있는데..
먼저 함수를 사용하고 바깥에서도 변수를 사용해야 하니 함수안에서 global 변수 선언해주는게 낯설었다.
그리고 h와 같은 문자가 오냐 안오냐를 판별할 때도, 그 때의 인덱스를 저장하고 인덱스가 저장되지 않으면 False를, 저장되면 그다음부터 e를 찾는 방식으로 판별하였다.
rating1000 문제를 접한지 얼마 안되서 그런지 혼자 푸는데 몇시간정도 소요되었다... 이 정도 난이도 문제에 다시 익숙해져 보자.