백준 - 5397 : 키로거

밀양박최고점박혜성·2022년 7월 13일
1

Stack

목록 보기
1/2
# KeyLoger
import sys
ans2 = []
a=int(input())
for _ in range(a):
    ans = []
    left_ans = []
    pw = sys.stdin.readline().strip()
    length = len(pw)
    if(length > 0) :
        for i in range(length):
            if (pw[i] == '<'):
                if ans :
                    left_ans.append(ans.pop())
            elif (pw[i] == ">"):
                if left_ans :
                    ans.append(left_ans.pop())
            elif (pw[i]=="-"):
                if ans :
                    ans.pop();
            else :
                ans.append(pw[i])
    if left_ans :
        while True :
            if not left_ans : break
            ans.append(left_ans.pop())
    print(''.join(ans))

백준 5397번 바로가기

처음에는 배열로 접근하여 문제를 해결하고자 하였다.

이거말고도 두 페이지 더 있음

하지만 시간초과<- 욘 석이 계속 나왔다

이유는 배열로 구현하고자 했을 때, insert와 dle() 할 때 배열의 요소들이 한 자리씩 밀리거나 당겨지거나 할때 시간이 O(1)이 아닌 O(N)으로 들기 때문이다.

따라서 이 문제는 자료구조 중에서 배열이 아닌 다른 자료구조를 사용하여야 했다.

맨 처음에는 스택과 연결리스트를 생각해서 풀려고했지만, 배열로도 충분히 할 수 있을 것 같다는 생각이 들어 배열로 길을 잡고 시작했다.

3-4시간 동안 머리를 박아보니 느껴지는 점이 있다.

코딩테스트는 "시간", 즉 결과만이 아닌 효율 또한 중요하게 생각해야할 요소라는 것이다. 이 문제는 배열로도 구현 가능했지만 스택과 연결리스트를 사용해서 문제를 해결하는 것이 더 빠른 시간안에 결과를 도출할 수 있었다.

고작 별 2개짜리에 이렇게 박아대니 큰일났다 증말

또한, 중요한 요소가 "조건" 이다.

스택을 이용하여 구현을 다하고 파이참으로 반례까지 찾아보면서 틀린 것이 없나 찾아보았지만 결과가 모두 잘 나왔다. 하지만 백준에서는 "틀렸습니다"가 계속 나왔다.

내가 조건을 잘못썼나? 생각하고 조건을 다시 보았지만 전혀 감이 잡히는게 없었다.

혹시나 하고 대문자, 소문자, 숫자 (비밀번호에 해당하는 부분)을 스택에 append하는 코드를 유심히 보았다.

   if ((pw[i] <= "Z" and pw[i] >= 'A') or 
   		(pw[i] <= 'z' and pw[i] >= 'a') 
   		or (pw[i] >= "1" and pw[i] <="9")):
                ans.append(pw[i])

사실 지금도 뭐가 다른지 모르겠다.

입력한 비밀번호는 문자열이니까 숫자도 당연히 문자 취급하는 것이 아닌가??

라고 생각했지만 그냥 한번 else로 빼볼까 하고 돌려보니까 잘됐다...?

조건과 사용할 자료구조 잘 정하기

profile
어..ㅓ 이게 왜 돌아가

0개의 댓글