22.08.15 TIL

옵주비·2022년 8월 15일
0

SW사관학교 정글이라는 딱지를 떼고 처음으로 작성해보는 TIL이다. 수료 후에 나흘간을 어떻게 보냈는지를 돌아보고, 앞으로의 계획을 가볍게 세워보았다. 그리고 오늘 저녁에 대전에 돌아와서 푼 알고리즘 문제를 정리해보았다 🙃

지난 4일에 대한 회고

정글이 끝나니 확실히 공부가 쉽지 않다. 물론 집안에 일이 좀 있어서 공부가 손에 잡히지 않은 것도 있다. 정글 과정에 참여하느라 가지 못했던 할머니 병문안도 다녀오고... 가족들이 코로나에 걸려서 갑자기 본가에도 못 가고... 수료 이후에 아직 만나질 못해서 속상하다. 코로나가 아주 말썽이다 😭

이력서와 자기소개서를 작성할 때도 느꼈지만, 확실히 대전에서 학습만 신경 썼을 때보다 서울에서 각종 집안일 등등을 겸하면서 공부하는 것이 몰입은 떨어지는 거 같다. 대전에서는 특별히 계획을 세우지 않고 하루하루를 보내면서 공부해도 괜찮았지만, 서울에서는 안 되겠다는 생각이 들었다.

정글에서의 절반만큼이라도 몰입하려면...?

정글에서 하던 것의 절반만큼이라도 몰입해보는 것을 현재 단계에서 최소 목표로 설정했다. 주어진 환경이 다른 상황에서, 루틴을 지키는 '규칙적인 삶'을 살아야 그나마 절반이라도 가능할 것 같아서 몇 가지 계획을 세웠다.

우선 공부 환경을 확실히 만들 생각이다. 짐을 마저 챙겨갈 겸 해서 오늘 저녁에 다시 대전으로 내려왔는데, 수요일에 협력사 면접이 있어서 그거 끝나고 이제는 완전히 서울로 올라갈 생각이다. 목요일에 출근 시간대를 피해서 서울로 올라간 후에, 알고리즘 3문제를 딱 풀고 나서 그날은 종일 방 정리만 할 생각이다. 그리고 대전 내려오기 전에 당근에서 무료 나눔 받은 의자가 아무래도 장시간 앉아있기엔 좋지 않아서, 새로 하나 장만할까 싶다.

또한 매일 아침을 명상과 하루 계획 수립으로 시작하려고 한다. 서울에서의 본격적인 공부는 금요일부터겠지만, 예행 연습하는 셈 치고 대전에서 보내는 마지막 3일도 그렇게 해보려고 한다. 당장 내일 아침부터 !

마지막으로 운동 시간이나 데이트 시간 등을 확실히 정하려고 한다. 자꾸 신경이 분산되니까 몰입도가 떨어지는데, 소프트웨어 엔지니어의 길을 선택한 이상 단순히 취업을 위해서가 아니라 나 자신의 퍼포먼스를 위해서 공부하고 싶은 것들이 이것저것 많다. WWDC 같은 것도 관심을 좀 갖고 지켜보려고 하고...일단은 이렇게 3가지를 계획을 하고 있는데, 다음 주 금요일쯤에 진행 상황을 점검해보도록 하자. 주변에 더 이상 친구들이나 코치님이 없다고 해이해지지 말고 정진하자!

알고리즘

원래 계획은 정글이 끝나고 매일 3문제를 푸는 것이었는데, 사실 코딩테스트에 얼마나 힘을 쏟아야 할지 감이 잘 잡히지 않는다. 코딩테스트 자체를 보지 않는 회사들도 많고, 인터넷 검색이나 자주 쓰는 코드를 가져갈 수 있는 환경이라면 솔직히 풀어내는 것이 그렇게 어렵지 않다고 생각하기 때문이다. 그래도 혹시나 모를 상황을 대비해서 열심히 해두는 것이 나쁘진 않을 테니, 수요일에 협력사 면접을 보고 난 후에 목요일부터는 3개씩은 풀 계획이다. (그래서 위에서도 목요일 청소 전에 굳이 3문제라고 언급한 것이었다!)

어쨌거나 오늘은 백준에서 한 문제를 풀어보았다. 코치님께서 '알고리즘 문제 모음'으로 100개의 문제 리스트를 주신 것이 있는데, 그중 한 문제이다.

백준 - 에디터

오늘 풀어본 문제는 백준의 에디터라는 문제이다. 항상 느끼는 것이지만 프로그래머스나 릿코드에 비교하면 좀 아쉽다. 몇 개의 테스트 케이스를 틀렸는지 전반적인 진행상황을 알 수가 없기 때문이다. 테스트 케이스 20개 중에 19개가 맞고 하나가 틀리는 코드더라도, 그 하나가 가장 1번째 케이스라면 시작하자마자 '틀렸습니다'를 띄운다는게.... 차라리 '총 XX % 정답입니다' 라고 띄워주면 그나마 나을 것 같다. 어쨌거나 문제는 다음과 같다.

처음에는 커서 위치를 now라는 변수에 할당하고 그걸 함께 조정해가면서 해결하려고 했다. 명령어에 'P'나 'B'가 들어와서 문자열에 변화가 생길 때마다, 그때마다 새로운 문자열을 생성하는 방식이었는데 시간 초과가 났다. 이번 문제는 꽤나 오래 고민해봐도 자꾸 시간 초과가 나서 간단히 힌트를 하나 참고했다. 리스트를 2개 쓰라는 힌트였는데, 그걸 보자마자 쉽게 풀어버렸다. 왜 2개를 쓸 생각을 못 했을까...?

좀 더 편하게 풀기 위해서 파이썬에서 제공하는 deque를 활용했다. 최초에는 주어진 문자열로 구성된 것 하나(q1)와 비어있는 것 하나(q2)를 생성해주었다. 이렇게 하면 커서의 위치를 기준으로 q1과 q2가 구분되게 된다.
따라서 현재 커서 위치가 가장 앞인 것은 q1이 비어있는지를 통해, 현재 커서 위치가 가장 뒤인 것은 q2가 비어있는지를 통해서 알 수 있다.

이후에는 주어지는 명령어에 따라서 알맞게 처리해주었다. L이나 D를 통해 커서의 위치가 바뀔 때에는, q1에서 q2로 혹은 q2에서 q1으로 옮겨주었다. 또한, B나 P가 주어질 때는 커서 왼쪽에 대해 처리를 하는 것이므로 오직 q1에서만 처리를 해주었다.

이러한 로직에 따라 구성한 코드는 아래와 같다..... 성공 :D

from sys import stdin
from collections import deque
input = stdin.readline

S = input().strip() # 주어진 문자열
q1 = deque(S) # 주어진 문자열로 스택을 생성
q2 = deque()
M = int(input()) # 입력할 명령어의 개수

for _ in range(M):
    now = input().strip().split()
    order = now[0]
    if order == 'L':
        if not q1:
            continue
        q2.appendleft(q1.pop())
    elif order == 'D':
        if not q2:
            continue
        q1.append(q2.popleft())
    elif order == 'B':
        if not q1:
            continue
        q1.pop()
    else: # order == 'P'
        q1.append(now[1])

print(''.join(q1+q2))

0개의 댓글