22.08.08 TIL

옵주비·2022년 8월 8일
0

최종 발표가 끝난지 얼마 되지도 않았지만, 숨을 돌릴 틈이 없다. 안주먹을 시간이 없어요... 느낌이랄까. 내일 자정까지 협력사에 제출할 이력서와 자기소개서를 작성해야 내야하다보니, 오늘도 아침 8시에 일어나서 바쁜 하루를 보내고 있다. 개발자 이력서 작성은 처음이라, 고민 끝에 마음에 드는 강의가 있길래 가볍게 들으며 참고 중이다.

그런 와중에 알고리즘도 다시 풀어보기 시작했는데, 오늘 가볍게 풀어본 문제 하나를 정리해보려 한다.

알고리즘

프로그래머스 - 음양 더하기

오늘 풀어본 문제는 음양더하기 라는 문제이다.
이력서를 쓰다가 프로그래머스 이력서 양식도 괜찮다고 해서 접속했는데, 메인 페이지에 오늘의 추천문제(?)로 이 문제가 떠있어서 풀어봤다. 약 2주만에 알고리즘 문제를 풀어보는거라, 약간 걱정하면서 풀었다.

문제를 보자마자, 음 이거 true랑 false를 어떻게 1과 -1로 바꾸지? 라는 생각이 들었다. 반복문을 쓰면야 바로 풀릴 문제긴한데 뭔가 한번에 잘 풀고 싶었달까...? 그래서 List Comprehension을 이용해 풀려고 했고, 고민 끝에(?) 3분정도 걸렸다.

def solution(absolutes, signs):
    return sum([x if y else -x for x,y in zip(absolutes, signs)]) 

파이썬에서 zip으로 묶으면 absolutes에서 하나, signs에서 하나씩 해서 쌍으로 묶어주는 효과가 있다. 따라서 입출력 예시 1번 기준으로 첫번째로 계산되는 x,y는 4 와 true가 되겠다. 조건문을 주어 y가 true면 x*1 = x를, y가 false면 x*-1 = -x로 치환하는 '실제 수'들의 리스트를 만들고 그걸 sum으로 해서 총합을 구했다. 이렇게 풀면 0.08ms 정도 나오는데, 사실 제일 짧은 풀이일지언정 가장 빠른 풀이는 아니다. 아무래도 실제 수의 리스트를 만드는데 O(N)이 걸리고, 계산하는데 또 다시 O(N)이 걸리기 때문이다. 즉 for문이 2번 도는 셈인데, 이를 딱 1번의 O(N)으로 처리하려면 다음과 같이 풀면 된다.

def solution(absolutes, signs):
    answer = 0
    for absolute, sign in zip(absolutes, signs):
        answer = answer + absolute if sign else answer - absolute
    return answer

이렇게 풀면 for문 1번에 답을 얻으면서 0.05ms 정도 나온다.

오랜만인데 수월하다 싶었는데, 레벨 1 문제였다. 아마 2주 전에 한창 감이 좋았을 때 풀었으면 1분 걸렸을 문제인데 약간 녹슨 감이 있다. 오늘을 시작으로 이번에도 하루에 최소 하나 이상의 알고리즘 문제를 풀고, TIL을 남기도록 해야겠다 :)

기왕 레벨 1짜리 문제를 푼 김에, 우선 프로그래머스의 모든 레벨 1 문제를 풀어야겠다. 레벨 1이라고 해서 모든 문제를 풀어낼 것이라는 자만심은 잠시 접어두고... 다시 감을 끌어올린다는 생각으로 천천히, 하나하나 해보자!

0개의 댓글