ignoreOrange
1k
2019-08-08 15:00:18
4
364

문제해결 접근 방법... for문만 생각하는 저 어떻게 해야할까요?


만약 면접을 보러 갔는데 면접관이 1~100까지의 합을 구하는 법을 코딩해보라고 한다면


어려분은 어떻게 풀 거 같아요?


바로 반복문(while or for)이 생각나는 분들이 있을거 같습니다.


저또한 for(i=1... 를 먼저 생각했으니깐요.


그런데


수학에서


일정 수의 합인 등차수열을 구하는 공식이

n(n+1) / 2

인 것을 아는 분도 있을 겁니다.


이 공식을 사용하면


const n = 100;

console.log(n*(n+1)/2);


5050 이라는 결과값을 쉽게 구할 수 있습니다. 메모리 사용량도 적을거구요.


이렇게 푸는 사람을 보고 처음엔 저는 충격먹었습니다.


저런 방법이!... 이놈에 수학...




매일 프로그래밍에 들어가서 구독하면


일주일에 한번? 간단한 알고리즘 문제를 메일로 보내주는데


이번에 온 문제가 


const array = [-1, 0, 1, 5, 3];

const target = 2;


배열에서 target번째로 큰 수를 구하라 입니다.


저 배열에서는 크기 순이 [5, 3, 1, 0, -1] 이니 답은 3 이겠죠?


지금 제가 아는 지식으로 문제를 풀면


2중 for문으로 정렬하여 두번째 인덱스를 가져올거 같습니다.


또는 


const array = [-1, 1, 0, 5, 3];

const target = 2;

const result = array.sort().reverse();

console.log(result[target - 1]);


위에 코드처럼


자바스크립트 내장된 함수를 사용해서 target번째의 값을 가져올수도 있겠죠.


그런데 


내장된 함수는 이미 구현된 함수를 가져다 쓰는거니깐 값은 구했지만 조금 찝찝합니다.


그렇다고 또 2중 for문을 쓰려고 하니... 너무 구식 방법같고 없어 보입니다.


이런 문제는 어떤식으로 접근해야할까요?


물론 알고리즘은 연습이 답이지만


선배님들은 어떤식으로 접근하세요?


(요즘 map(), reduce(), filter(), find() 이런 함수들도 많던데 이런걸 공부하고 내꺼로 만들어서 풀어야 할까요?)


1
0
  • 답변 4

  • 두더지
    341
    2019-08-08 15:10:35

    저도 좀 정형화된 접근법같긴한데

    소팅(퀵소팅)이나 선택정렬 이후 큰거면 뒤에서부터 작은거면 앞에서부터 로 찾아낼 것 같습니다.


    위의 n(n+1) 처럼 팩토리얼, 소수구하기(에라토스테네스의체) 등은 수학적인 접근이라 해당 문제를

    for문으로 접근했다고해서 주눅들건 없을 것 같아요!


    실제로 탐색문제풀때 완전탐색의 경우 3중포문까지도 썻었던것같네요 쥬륵

    1
  • dohyeong
    723
    2019-08-08 15:15:01

    quick select 알고리즘도 있죠.

    map, reduce, filter, find는 for문을 좀 더 아름답게 써놓은 거니까, 알고리즘 측면에서는 달라질게 없어요. 함수형 프로그래밍과 관련해서 알아두면 좋은 개념이긴 하죠.

    1
  • Aaron
    1k
    2019-08-08 15:20:42

    일부 대기업 중에 알고리즘 시험에서 말씀하신 표준 라이브러리를 못 쓰게 하는 경우도 있습니다.

    Java에서 Collection만 쓸 수 있어도 아주 수월하게 해결할 수 있는 문제들도

    직접 구현해서 써야 하는 상황인데요...

    현업에서는 사실 그렇게 개발하는 경우는 거의 없죠.

    (그렇다고 그런 능력이 불필요하다는 건 아닙니다.)


    그런 것보다 표준 라이브러리를 잘 알고 적재적소에 잘 활용할 수 있는 것이 중요합니다.

    말씀하신데로, "내장된 함수"를 사용하여 문제를 해결하는 것이 더 좋다고 생각합니다.

    그런 점에서 저도 코틀린으로 작성해봅니다. (작성자 분의 코드와 거의 동일합니다.)

    val array = arrayOf(-1, 0, 1, 5, 3)
    val target = 2
    
    val result = array.sortedArrayDescending()[target - 1]
    println(result)


    map, reduce, filter, find 등 함수형 프로그래밍을 도와주는 도구들을 공부할까 말까 고민이신가요?...

    이런 것이 고민해야할 꺼리인지 의문입니다.

    개발자로서 새로운 도구, 패러다임이 계속해서 나옵니다.

    map, reduce, filter, find 없으면 개발 못하나요?

    기존 for, while 만으로도 충분히 할 수 있습니다.

    그럼 누가 왜 그런 것들을 만드는 걸까요?

    더 나아가, javascript 하나로도 되는데, 왜 jquery가 나왔고, 그걸로 모자라 react니 angular니 vue니 왜 나왔을까요?


    지금보다 더 나은 개발 환경을 만들어주기 때문이라고 생각합니다.

    왜 함수형 프로그래밍을 사람들이 얘기하는지...

    항상 이런 새로운 것들에 대해 관심을 갖고 찾아보고 학습하는 것이 좋은 개발자로서의 자세라고 생각합니다.

    그런 점에서 작성자님이 마지막에 질문하신 부분은...

    다소 우문이란 생각이 드네요.

    1
  • fender
    14k
    2019-08-08 15:30:15

    윗 분 말씀대로 알고리즘과 map/reduce/filter 등 함수형 접근을 위한 도구는 조금 분류가 다른 지식입니다.

    다만 해당 개념들 또한 for 문 같은 명령형 접근을 선언적인 방식으로 대체한다는 점에서는 제시하신 예와 비슷하게 볼 수도 있을 듯 합니다.

    (요즘에는 for/while 같은 반복문은 '또 다른 goto'라고 표현할 정도로 구시대의 유물 취급하기도 합니다.)

    2
  • 로그인을 하시면 답변을 등록할 수 있습니다.