본문 바로가기

TIL

20210623 [항해 17일차] 알고리즘 주차 마무리

 

목적없는 공부는 기억에 해가 될 뿐이며,
머리 속에 들어온 어떤 것도 간직하지 못한다.

- 레오나르도 다빈치 -

 오늘은 알고리즘 주차 마지막 날이다.

처음에는 혼자 풀 수 있던 문제가 없었는데 점점 문법적인 것도 익히고, 문제에 대해 어떻게 접근 해야될지 알게되고 답을 찾아보지 않고 풀어보기도 하고, 정답을 보더라도 해석에 걸리는 시간이 점점 줄어든 느낌이 든다. 

 

 대부분의 문제는 고민만 몇 시간 정도 하다가 답을 보고 풀고 다시 며칠 후 풀어보는 형태로 진행했다.

사칙연산, if문, while문, 함수, 문자열, 브루트포스, 배열, 리스트, 재귀, 정렬, 이분탐색 큐, DP, 분할 정복, 백트래킹 등 

처음엔 생소하던 용어들이 점차 익숙해지고, 뭘 해야할지도 모르던 처음과 비교했을 때 이제 구글링을 통해서 필요한 것들을 찾아가며 답을 구하는 과정을 해낼 수 있다는 것만으로도 크게 성장했다고 느낀다. 

 

조건문이나 반복문속이 이중 삼중으로 쓰이게 될 경우 너무 헷갈리고, 구현하기도 어려운데 계속 사용하면서 익숙해져야한다.

 

재귀, 함수, 이분탐색, 백트래킹, DFS, BFS는 어려워서 매번 관련 내용을 찾아보기는 하는데 구현이 정말 안된다. 그나마 쉬워보이는 함수부터 정복하고 이분탐색을 마저 구현해봐야겠다.

 

알고리즘 스터디 그룹은 하길 잘했다고 느꼈다. 처음 정말 뭘 할줄도 몰라서 각자 문제를 맡아 발표하기로 했는데 첫 번째와 두 번째 날에 정말 횡설수설하며 말하고, 공부한 부분을 제대로 설명 못해주는 것 같아 죄송스러웠는데 다행히 너그럽게 이해해 주시고, 다들 풀이하면서 알아온 내용들을 수준에 맞게 잘 설명해주셔서 다음 문제 풀 때 혹은 같은 문제를 다시 풀어볼 때 도움이 많이 됐다.

시간과 회의시간을 계속 갖다보니 알고리즘에만 계속 몰두하며 집중력이 흐트러지는 것을 환기시켜주는 효과도 있었다.

 

7시부터 시작한 항해톡에서는 쿠키/세션/캐쉬에 대한 간략한 특징과 설명 그리고 클린코드에 대해서 들었다.

클린코드는 정말 나를 위해 준비된 것이 아닌가 할정도로 유익했다.

내 코드는 내가봐도 가독성이 좋지는 않은데 이게 협업할 경우 가독성 안좋은 것이 얼마나 큰 자원을 소모하는 일인지 심각성을 알게되었다.

우아함, 효율적인, 간단한 논리로 이뤄져 버그가 숨어들 공간이 없는 코드를 만드는 것이 클린코드의 핵심이라고 한다.

설계자의 의도를 드러내고, 명백하고 단순하게, 의미있는 이름으로, 함수는 기능별로 잘게 쪼개서, 인수는 최소화하여, 쓸데없는 주석을 지우고, to do 해야할 것들을 주석으로 남기는 것 등을 조언으로 들었다.

당장에도 기능별로 의미있게 이름 짓는 것과, 같은 기능을 하더라도 논리를 간단하게 하도록 노력하는 것은 할 수 있을 것 같다. 

 

클린코딩을 안하게 되어 오늘 내가 알고리즘 스터디에서 발표한 터렛 문제도 풀 때 코드를 많이 갈아엎었다.

처음에는 그냥 작은 조건조건들을 생각나는대로 if와 elif를 마구잡이로 넣어서 전체 경우 중 어떤 경우를 넣었고 어떤 경우가 남았는지 확인이 어려웠는데 변수를 직관적으로 선언하고, 경우의 수를 최대한 줄여 코드를 작성하니 정말 간결해졌다. 체감상 2배 정도 코드 글자 수가 줄었고, 조건에 따른 경우가 한눈에 들어왔다.

매번 느끼는 예외처리하고 모든 상황을 다 넣는 것이 알고리즘에는 상당히 중요하다는 것을 오늘도 느꼈다.

궁금한거 질문할 때 마다 답해주시는 분께 감사인사를 드리고싶다.

 

 

정말 신이 난다! 하하하하

 

import sys, math
input = sys.stdin.readline

T = int(input())

for i in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    distance = (math.sqrt(math.pow(x1-x2,2) + math.pow(y1-y2,2)))
    # distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5         #위 식과 동일한 결과
    # m = list([r1, r2, distance])

    if distance == 0:
        if r1 == r2:
            print(-1)
        else:
            print(0)
    
    else: 
        if distance > r1+r2 or distance < abs(r1-r2):
        # if max(m) > sum(m) - max(m):                위에 or 조건을 바꿔쓴 경우
            print(0)
        
        elif distance == r1+r2 or distance == abs(r1-r2):
            print(1)
        
        else:
        # elif distance < r1+r2 and distance > abs(r1-r2):  # and 조건이 아닐 경우 안만나거나 1점만 만날 수도 있음
            print(2)

위 식을 더욱 가독성이 좋거나 간단하게 바꿔서 써보기도 했다. 

 

sqrt는 루트씌우는 것이고, pow(a, b)는 a를 b제곱하라는 뜻이다.

distance = (math.sqrt(math.pow(x1-x2,2) + math.pow(y1-y2,2)))

distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5     

 

 

두가지 경우가 아래 코드를 사용할 경우에 한가지로 줄어든다. 변수를 어떻게 설정하냐에 따라 이렇게 간단해질 수 있는게 놀랍다.

if distance > r1+r2 or distance < abs(r1-r2):

if max(m) > sum(m) - max(m):

 

내일부터는 주특기로 선택하게된 Node.js 문법부터 공부할 예정이다. 스타트업에서 많이 쓰이고, 쉽고 빠른 프로젝트 실행으로 결과물을 낼 수 있는게 특징이라고 한다.

 

'TIL' 카테고리의 다른 글

20210625 [항해 19일차] Node.js 첫 경험  (0) 2021.06.26
20210624 [항해 18일차] JavaScript 첫 경험  (0) 2021.06.25
20210622 [항해 16일차]  (2) 2021.06.23
20210621[항해 15일차]  (0) 2021.06.22
20210620[항해 14일차]  (0) 2021.06.20