회고

2주간 자료 구조 문제를 풀었다. 큐, 스택부터 시작해서 트리와 맵을 이용하는 다양한 문제를 접했다. 실버 2까지는 순조롭게 풀렸으나 그 이후 난이도의 문제의 경우 활용 단계에서 어려움을 겪었다.

문제 해결을 위한 자료구조를 선택하고 사용하는 능력은 개선되었으나, 응용이나 구현 능력이 부족하다고 느꼈다. 골드 3만 넘어가도 구현에서 허덕이고 멘탈이 깨지는 상황이 많이 발생했다. 이를 극복하기 위해 무작정 코딩으로 들어가거나 머리 속으로 생각하는 방법은 지양하자.

2주간 총 27문제를 접했으며 해결하는 과정에서 어려움을 겪었던 문제들에 대해서 작성했다.

문제

  • 2346. 풍선터뜨리기

    알고리즘 분류는 덱으로 되어있지만, 원형 큐와 같은 자료 구조를 사용하면 문제를 해결할 수 있을 거 같았다. 하지만 다음과 같은 문제들을 고려하지 못해서 어려움을 겪었다.

    1. 풍선의 인덱스와 자료 구조의 인덱스 불일치
    2. 실시간으로 줄어드는 자료 구조의 크기

    0부터 시작하는 자료 구조와 1부터 시작하는 풍선의 인덱스를 맞추면서 계산식을 작성하는 곳에서 시간이 많이 걸렸고, 자료 구조의 크기가 점점 작아지는 걸 생각하지 못하고 초기에 입력받은 크기로 나누고 있었다.

    문제 풀이 코드

  • 1874. 스택 수열

    입출력 예시를 통해 가장 큰 숫자를 기준으로 오른쪽이 오른차순인 경우에만 스택 수열을 생성할 수 있다고 생각했다. 그래서 입력을 받은 이후 바로 스택 수열을 만드는 것이 아닌, 검사를 통해 만들 수 있는지 없는지를 판단했다.

    하지만, 해당 방식을 통해 코드를 작성하니 출력 초과로 오답 처리가 됐다. 백준 게시판에 질문을 올렸는데, 아직까지 답변이 없다..

if (index != n) return "NO";
작성하면서 문제를 다시 풀어봤다. 조건을 추가하니까 정답처리가 되는 것을 보면, 오름차순뿐만 아니라 안되는 조건이 존재하는 것 같다. 

[문제 풀이 코드](https://github.com/Soundbar91/algorithmStudy/tree/main/%EB%B0%B1%EC%A4%80/Silver/1874.%E2%80%85%EC%8A%A4%ED%83%9D%E2%80%85%EC%88%98%EC%97%B4)
  • 2504. 괄호의 값

    문제를 접했을 때 느꼈던 생각은 괄호 문제를 이렇게도 응용할 수 있구나 였다. 갈피를 못 잡다가 손으로 계산 과정을 작성해보니, 숫자도 같이 스택에 넣으면 된다 라는 생각이 들었다.

    해당 접근 방법으로 코드를 작성하니 정답 처리가 됐다. 다만 과정에서 숫자와 문자를 변환하는 과정에서 예외가 많이 터졌다.

    문제 풀이 코드

  • 2800. 괄호 제거

    스택에만 집중하다 보니 다른 알고리즘을 적용할 생각을 못해 어려움을 느낀 문제였다. bfs 혹은 재귀를 통해 구현만 한다면 아주 쉽게 풀리는 문제였다.

    문제 풀이 코드

  • 22942. 데이터 체커

    하이라이트였다. 여기에 괄호문제를 적용한다는 생각 자체를 못 했다.

    코드 자체는 이전 문제보다 훨씬 적지만, 생각하는 것이 개인적으로 어려웠다. 기본을 활용하는 능력을 길러야 함을 느끼게 해준 문제였다.

    문제 풀이 코드

  • 2696. 중앙값 구하기

    처음에는 우선순위 큐에 넣으면서 홀수 번째 수가 나오면 우선순위 큐를 배열로 변환하고 정렬해서 중간 값을 구하면 될 거라고 생각했다. 하지만 값을 큐에 넣어도 우선순위 대로 정렬이 안되는 현상이 발생해서, 다른 풀이 방법을 생각하다 스스로 풀지 못했다.

    그래도 어느 정도 생각은 했다. 홀수 개의 숫자가 들어오기 때문에 2개로 나누게 되면 한 쪽에는 숫자가 하나 더 들어가니, 그것이 중간값이다까지 생각했다. 하지만 역시 발목을 잡는 구현 능력..

    문제에서 입력과 출력이 10개 단위로 끊어야 하기 때문에 다른 사람들은 이 부분이 까다롭다고 이야기 했지만, 개인적으로 여기서는 큰 어려움이 없었다.

    문제 풀이 코드

  • 21942. 부품 대여장

    문제의 요구 사항은 간단하기 때문에 쉽다고 느껴졌으나, 날짜 계산에서 아주 발목을 잡았다. 2021년 기준으로 월, 일, 시 그리고 분을 고려해야 하기 때문에 처음에는 아주 막막했다.

    자바 time 라이브러리의 LocalDateTime, Duration 그리고 format 등을 사용했다. 날짜 계산만 아니였다면 순조롭게 풀렸지 않았을까 라는 생각이 들었고, 해당 라이브러리의 사용법을 정리해야겠다.

    문제 제출 코드

  • 21944. 문제 추천 시스템 Version 2

    너무 어렵게 생각했다. 하나의 맵에서 모든 정보를 관리하니 값을 조회하는 과정에서 꼬이고 꼬였다.

    클래스로 묶지도 않아서 더 복잡해 보였고, 난사해버린 if문 때문에 코드를 고치는 과정에서도 멘탈이 터져버렸다.

이 문제를 풀 때도 머리 속으로 생각만하고 코딩을 했는데, 손으로 설계를 해 놓고 풀이에 들어갔다면 이런 대참사가 나타나지 않았을까?

[문제 풀이 코드](https://github.com/Soundbar91/algorithmStudy/tree/main/%EB%B0%B1%EC%A4%80/Gold/21944.%E2%80%85%EB%AC%B8%EC%A0%9C%E2%80%85%EC%B6%94%EC%B2%9C%E2%80%85%EC%8B%9C%EC%8A%A4%ED%85%9C%E2%80%85Version%E2%80%852)