카테고리 없음

코드포스 58A 풀이

ag2개발자 2022. 1. 29. 23:48
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 문제를 접한지 얼마 안되서 그런지 혼자 푸는데 몇시간정도 소요되었다... 이 정도 난이도 문제에 다시 익숙해져 보자.