20210712

Jin·2021년 7월 12일

Facts

  • 프로그래머스 <여행경로> 문제풀이
  • <웹을 지탱하는 기술> 독서
  • <코딩인터뷰 완전분석> 스터디

Findings

웹을 지탱하는 기술 세가지

  • 정보의 전달 - HTTP
  • 정보의 표현 - HTML
  • 정보를 가리키기 - URI

하이퍼미디어와 분산 시스템으로서의 웹

하이퍼미디어는 정보와 정보간의 링크를 통해서 비선형적 탐색을 제공하는 미디어를 말한다. 링크를 통해 연결된 정보는 하나의 컴퓨터에서 관리되지 않는다. 정보, 리소스는 많은 수의 호스트에 흩어져 있다. 웹을 지탱하는 기술을 통해서, 리소스에 접근하고, 리소스를 상호 전달하고, 리소스를 표현하는 것을 실현한다.

알고리즘 최적화 문제 해결 팁

1. 직접 해봐라

문제를 처음보고 대단히 효율적인 알고리즘 떠올리기는 대부분 실패한다. 그보다 더욱 확실한 방법은 단순한 예제를 직접 손으로 풀어보는 것이다. 이 과정에서 비효율적인 부분이 드러나게 된다. 거의 모든 경우에서 손으로 풀 수 없으면, 구현할 수도 없다.

2. 과제를 단순화 시켜 해결하라.

예를 들어, 잡지에서 단어를 오려 붙여서 어떤 특정한 문자열을 만들수 있는지 여부를 알고 싶은 경우를 생각해보자. 이때, 단어 를 다루기가 벅찬 경우는 글자 로 문제를 단순화 시켜서 생각해보고 구현해볼 수 있다. 내가 만들고 싶은 글자가 잡지에 있는지가 중요할 것이다.

3. 하나의 단계와 그 다음 단계로 파악하라.

모든것을 한번에 구하는 것보다, 단계별로 구하는 것이 항상 더 부담이 적다. 특히, 어떤 단계가 이미 이루어졌다고 가정하고, 그 다음 단계를 어떻게 해야 할지를 생각하는 사고가 유용할 때가 많다. Divide and Conquer 계열의 문제들이 이에 속한다.

예를들어, 순열의 가지 수를 구하는 경우를 생각해보자. abcde 의 순열을 구하는 경우, 단순한 단계로, ab, ba 를 생각해볼 수 있다. 이때, 다음 단계인 abc 의 순열을 구하려면, ab, ba 의 각 위치에 c 를 끼워 넣으면 된다. 즉, cab, acb, abc, cba, bca, bac 여서 총 여섯가지 경우를 만들 수 있다.

위에서 일반화하면, 이전 단계의 모든 위치에 하나의 원소를 끼워 넣으면 다음 단계가 된다. 가 된다를 얻을 수 있다.

4. 자료구조를 브레인 스토밍하라.

알고있는 자료구조를 하나씩 문제 상황에 대입해가며 적합한 것을 찾아본다. 스택, 큐, 해시테이블(맵, 딕셔너리), 링크드 리스트, 이진 트리, 힙 등등. 각각의 자료구조는 나름의 특성을 가지고 있다. 해당 특성이 이 상황과 맞는지 그렇지 않은지를 하나씩 평가해본 이후에 적합한 것을 대입해 본다.

알고리즘을 잘 푼다?

알고리즘 풀이의 개선을 위해서, 각 단계에서 무엇을 하려고 하는지 말과 글로 정리하는 연습을 하기로 했다. 알고리즘 문제를 혼자서 풀다보면 의도와 구현사이의 틈이 보이지 않는 경우가 많다. 심지어 구현을 먼저 하는것처럼 느껴질때도 있다. 이 사이의 틈을 벌려서, 의도가 더욱 분명해지고, 구현 옵션은 더욱 다양해지게 할 필요가 있었다.

'알고리즘을 잘 푼다' 라고 하는 것을, 문제 상황과 의도에 맞는 구현 옵션들을 빠른 시간안에 선택하는 것으로 정의했다. 그리고 그 능력을 기르기 위한 구체적인 방책으로 의도를 표현한다구현옵션을 선택한다를 나누어서 수련하기를 택했다.

의도를 표현하는 것은 문제를 분석해서 세부과제를 정의하는 활동이다. 예를들어, 카카오 2021 거리두기 확인하기 문제를 보면,

어떤 대기실의 거리두기가 지켜지고 있는가
대기실 모든 자리의 거리두기가 지켜지고 있는가 로 다르게 표현할 수 있다.

이렇게 정의하면, 대기실의 거리두기를 개별적인 자리의 거리두기로 분절해서 생각할 수 있게 된다. 각 자리의 거리두기도 언어적으로 분절하는 것이 가능하다.

각 자리의 거리두기가 지켜지고 있는가
인접한 자리가 안전한가 로 바꿀 수 있다.

인접한 자리가 안전한가인접한 자리
대각선 자리, 바로 옆 자리, 직선거리가 2인 자리 의 세가지 유형으로 분절할 수 있다.

이처럼 언어적으로 분절하는 것을 테스트 형태로 바꾸면 TDD를 적용할 수 있다. 예를 들면, 인접한 자리가 안전한가 를 테스트 기준으로 삼고 테스트 코드를 작성하고 확인할 수 있는 식이다.

Feelings

고양이 사진첩 문제를 스터디원들과 같이 다시 한 번 구현해보기로 했다. 지금 생각으로는 프레임워크를 이용하지 않는다면, 웹 컴포넌트(custom element) 가 좋은 방법 중 하나 같아서, 이것을 조금 더 깔끔하게 적용할 수 있도록 준비해서 피드백 받을 생각이다.


흐트러지지 말자. 의견과 실제를 구분하자. 다짐과 계획을 구분하자.

Affirmation

  • 나는 해결책을 모색하는 사람이다.

0개의 댓글