오늘의 코딩테스트 항해99 선별 level.1(최종복습장)

Edwin·2023년 2월 19일
0
post-thumbnail

프로그래머스 직사각형 별찍기

프로그래머스 직사각형 별찍기

  • 코드펜에서 문제를 풀 때, <br> 대신 개행을 뜻하는 \n을 기록해서 노드서버에 전달해야 한다.
  • 코트펜에서는 HTML에 전달해야 하기에 <br>를 기록했다.

프로그래머스 짝수와 홀수

프로그래머스 짝수와 홀수


프로그래머스 가운데 글자 가져오기

프로그래머스 가운데 글자 가져오기


프로그래머스 두 정수 사이의 합

프로그래머스 두 정수 사이의 합

그런데 가우스 공식으로 문제에 접근하셨던 분들이 있으셨는데 가우스 공식은 무엇이고, 가우스 공식으로 문제를 풀이한다는 것은 어떤 것일까? 또 찾아봐야지!!

가우스 공식의 배경
1787년 당시 10살이었던 가우스는 선생님이 낸 문제에 직면해서 가우스 공식을 만들어냈다. 가우스에게 주어진 선생님의 문제는 자연수의 합으로, 1부터 100까지 더한 값을 구하는 문제였다.

  • 가우스의 생각은 이러했다.
  • 1+100 = 101
  • 2+99 = 101
  • 3+98= 101
  • 뭐야 더해야할 숫자가 짝수이면 101*(더해야할 숫자/2)
  • 1~100을 더해야 한다면, 101 * 50 = 5050이 되는 것이다. 롸? 뭐라고!!
  • 1~101 : 101*50+101(마지막수) = 5151
  • 1~102 : 103*51 = 5253
  • 1~103 : 103*51+103(마지막수) = 5356

이를 활용한다면, 동률일 때는 둘 중 하나를, 그러지 않았을 때는 배열을 만들고 배열의 내용을 전부 더할 필요가 없이 가우스 공식을 통해서 두 정수 사이의 합을 구할 수도 있을 것이다.


그런데 뭐야 ㅋㅋ 벨로그 되는 줄 알았잖아!! 미리보기에서는 전부 적용되더니 안되네. 색상 정도는 <span>태그의 속성(style)값으로 지정이 가능한 것 같다.


프로그래머스 없는 숫자 더하기

프로그래머스 없는 숫자 더하기

function solution(numbers) {
    const answer = [0,1,2,3,4,5,6,7,8,9].reduce((acc, cur) => acc+cur, 0);
    const parameterNum = numbers.reduce((acc, cur) => acc+cur, 0);
    return answer-parameterNum;
}

사실 위의 값은 결과만 읽었을 뿐 문제에서 접근하라는 접근은 하지 못했다. 두 배열에서 일치하지 않는 정보를 찾아내는 것인데, 이럴 때 사용하는 것이 filter 메소드였다. 그렇게 풀어봤는데, 못풀었다. 왜지? 무엇이 틀렸을까? 긴배열에서 짧은 배열을 순회하면서 비교하고 없는 것을 넣으면 될 텐데.

일치하지 않는 숫자를 찾아보자.

function solution(numbers) {
  let num=[];
  for(let i=0;i<10;i++) {
    if(!(numbers.includes(i))) {
      num.push(i)
    }
  }
  return num
}

기초적인 방법인데, 최근에 어려운 메서드들만 풀려고 하다보니, 정작 이것들이 기억나지 않았다. 인간의 망각의 동물이랬다. 위에서 접근한 문제처럼 임의로 배열을 만들어주는 것이 아니라 반복문을 통해서, 동작시키며 조건물을 달아서 포함되지 않는 숫자들만 리턷되게 하면 되는 것이었다.

여기서 조금 수정을 가해서 if문 대신에 조건부 삼항 연산자를 사용할 수 있었다.

function solution(numbers) {
  let num=[];
  for(let i=0;i<10;i++) {
    !(numbers.includes(i)) ? num.push(i) : false
  };
  let answer = num.reduce((acc, cur) => acc+cur,0);
  return answer;
}

어쩌면 위의 방법이 더 간결한 방법같다. 일치하지 않는 배열을 찾을 수도 있고, 어려운 메서드들을 통해서 푼다면 아래의 방법도 있는 것이다. 그러나 이 방법이 처음부터 기억되지는 않았다. 이유는 복잡해서이다.

function solution(numbers) {
  let list = 
      Array.from({length:10},(item, i) => !(numbers.includes(i)) ? i : 0)
           .filter(el => el!==0)
  let answer = list.reduce((acc, cur) => acc+cur,0);
  return answer
}

먼저, 10개라는 비교의 대상이 있었기에 우선 희소배열 10개를 만들고, 그 안에 numbers에서 찾을 수없는 i만을 배열에 입력하게 두었다. 만약 일치한다면 0이 입력될 것이다. 그후, filter 메서드를 통해서 0이 아닌 요소만으로 배열을 구성하고, 해당 요소들을 누산해주었다. 이를 통해서 일치하지 않는 list도 구하고, 누산값도 구할 수 있는 코드를 작성했다.

그런데 글자수를 세어보면, 위의 단순한 계산이 193자, 아래의 복잡한 계산은 220자 나온다는 점이다.

데이터 처리 속도적인 측면에서도 단순한 for문이 3배 이상 빠른 것을 볼 수 있다. 여기서도 다시 느끼는 것은 코드의 세계도 똑같은 것 같다. Simple is Best!! 복잡한 것이 항상 일을 잘하는 것은 아니라는 말이다.

profile
신학전공자의 개발자 도전기!!

0개의 댓글