하루는 하루만 바라보게 해. 내일은 내일만 마주보게 해

벅차고 췰링한 사운드다
하루를 마무리하면서 듣기 좋은
주말에 역근처에서 밥 먹고 집까지 탄천 따라 걸어가면서 들어야 하는 노래


느린 춤 Slow Dance · 알레프 ALEPH

나는 고갤 저었지
아무 말도 안 했지
어차피 변명이니까
말해봤자 입만 아프다고

한참을 머뭇거렸지
내가 나로 살기엔
나는 너무 외로운데
너도 나와 같아 보이네

아 나는 느린 춤을 추고 싶은데
아 하루를 제대로 나 알고 싶은데
다가올 내일을 붙잡으려 하면
아 나는 느린 춤을 출 수 없는데

오늘을 돌봐야겠지
내일도 행복하려면
하지만 난 이미 벌써
내일이 맘에 들지 않는데

그래서 눈을 감았지
기억 안 날 꿈을 꾸려고
문득 눈을 떠보니
내일이 오늘이 되어있네

아 나는 느린 춤을 추고 싶은데
아 하루를 제대로 나 알고 싶은데
다가올 내일을 붙잡으려 하면
아 나는 느린 춤을 출 수 없는데

Oh let me dance
oh let me dance babe
하루하루 let me seize the day
Oh let me dance
oh let me dance today

하루는 하루만 바라보게 해
내일은 내일만 마주보게 해
Oh let me dance
oh let me dance today

아 나는 느린 춤을 추고 싶은데
아 하루를 제대로 나 알고 싶은데
다가올 내일을 붙잡으려 하면
아 나는 느린 춤을 출 수 없는데

더 나은 사람이 돼보자

이별하고 듣기에 건강한 노래
이상적이지만 누구보다 현실적인 노랫말


김수영(Suyoung Kim) – ‘더 나은 사람 (better)’

너에게 해줄 말이 있었는데
전해주질 못했어
이제는 너의 뒷모습만이 내게
가까워지나 봐

우리라는 말 이제는 점점 더
써 볼 일이 없는 것 같아
한때 사랑했던 그대에게 나
이제야 말해본다

나는 너를 사랑했었고
너는 내게 정말 좋은 사람
우리 사랑했던 것만큼
서로 잊고 살아가자

이제는 ‘우리’ 아니지만
남이 되어 서로 잊혀지길 바랄게
조금 더 나은 사람이 돼보자

언제부턴가 달라져가는 우리
마지막 모습일 것 같아
한때 사랑했던 우리의 모습을 잠시 동안만이라도
되돌아볼 수 있을까

우리 처음 만난 그 때로
돌아갈 수 있다면
조금 더 달라졌을까

다른 사랑한다면
지금보다 천천히
다시 사랑을 나눌 수 있을까

나는 너를 사랑했었고
너는 내게 정말 좋은 사람
우리 사랑했던 것만큼
서로 잊고 살아가자

이제는 우리 아니지만
남이 되어 서로 잊혀지길 바랄게
이게 네게 전해주는 마지막

나는 너를 사랑했었고
너는 내게 정말 좋은 사람
우리 사랑했던 것만큼
서로 잊고 살아가자

이제는 우리 아니지만
남이 되어 서로 잊혀지길 바랄게
조금 더 나은 사람이 돼보자

# [일일코딩 #34] Two sum

이건 쉬웠당 15분도 안걸린듯
몇년전에도 풀었던거같다 유명한 문제자너 이름도 익숙하구

Question

링크

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

My answer

어제도 썼던 indexOf 써서 풀었당
for문을 돌리면서 target에서 el을 뺀 diff값이 나머지 array에 있는지 확인하면 됨.

var twoSum = function(nums, target) {
    for(let i=0; i<nums.length; i++) {
        const foundIdx = nums.indexOf(target - nums[i]);
        if (foundIdx >= 0 && foundIdx !== i) {
            return [i, foundIdx]
        }
    }
};

옛날에 푼걸 봐볼까

걍 똑같이 풀었네..

var twoSum = function(nums, target) {
  for (var i = 0; i <nums.length; i++) {
    var lastIdx = nums.lastIndexOf(target - nums[i]);
    if(lastIdx > 0) return new Array(i, lastIdx);
  }
};

[일일코딩 #33] Remove Duplicates from Sorted Array

일일코딩 #32가 2017년 6월이었고, 오늘의 일일코딩 #33은 2019년 11월이다. 2년이 넘었다.
2년만에 푼 알고리즘 문제는 아주 노답이었다고 할 수 있다.
Leetcode easy난이도 문제인데 한시간 걸렸거든.
와 정말 부끄럽다.

영어 설명을 제대로 읽지 않은 탓도 있다.
Array의 duplicated된 엘리먼트를 지우라기에 당연히 지워진 array를 반환하는줄 알았지.
그런데 반환값은 Array의 length뿐이었고 Params로 온 Array의 reference를 받아 원본 Array를 중복 없이 만드는거였다. 메모리 새로 안쓰고.

담엔 잘 읽어.

Question

Leetcode 링크
Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

즉 아래와 같다.

removeDuplicates([1,1,2]); // returns 2 (원본 Array는 [1, 2]로 modify됨)

removeDuplicates([0,0,1,1,1,2,2,3,3,4]); // returns 4 (원본 Array는 [0, 1, 2, 3]로 modify됨)

My answer

While문을 돌면서 해당 element가 Array의 맨 마지막에 있는지 확인했다.
맨 마지막이면 살려주고 아니면 splice로 제거.
정렬된 배열이라 다 뭉쳐있을테니 각 뭉치의 제일 오른쪽 애들만 남긴다는 아이디어였다.

var removeDuplicates = function(nums) {
    var count = nums.length - 1;
    while(count >= 0) {
        if(count == nums.lastIndexOf(nums[count])) {
            count--;
        } else {
            nums.splice(count, 1);
        }
    }

    return nums.length;
};

잘 되긴 한다.

성능은 후지다. 이 퍼센트가 뭔가 했더니 하위 5%, 18%더라.

Runtime: 224 ms, faster than 5.75% of JavaScript online submissions for Remove Duplicates from Sorted Array.
Memory Usage: 37.8 MB, less than 18.75% of JavaScript online submissions for Remove Duplicates from Sorted Array.

처음에 param으로 받은 Array를 reference로 고쳐야한단걸 몰랐을때는
Array.prototype.reduce로 접근했다. prev, next를 돌며 앞뒤가 다르면 새로운 Array에 push해줬음. 그건 그것나름대로 제일 앞 or 제일 뒤가 edge case라는 헛점은 있더라 – 무튼 안됨.

다른 사람들은 어케 했는지 보자

Others’ answer

Best practice

var removeDuplicates = function(nums) {
    if (nums.length == 0) return 0;
    var i = 0;
    for (var j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}

첨엔 이해가 안갔다
이건 [0,0,1,1,1,2,2,3,3,4][ 0, 1, 2, 3, 4, 2, 2, 3, 3, 4 ]로 만들텐데 그럼 뒤에 더러운 숫자들이 남지 않는가?

근데 다시 Question을 읽어보니 뒤에 더러운 숫자가 있던 없던 반환한 lengthNum 길이만큼만 일치하면 되는거더라구.
문제가 여러모로 깔끔하지 못하네…

Answer by @Qfab

var removeDuplicates = function(nums) {
    nums.splice(0, nums.length, ...(new Set(nums)));
};

변태코드