TIL | 항해 8일차 | 프로그래머스 | 알고리즘 시작

isthis·2021년 11월 9일
0
post-thumbnail

2021.11.08

알고리즘 공부 시작

알고리즘 기초에 대해 학습하는 주간이 되었다.
(그리고 오늘은 나의 찐전역날 ㅎㅎ 이제 민간인이다!)
알고리즘은 처음인데 나름 해결해나가는 재미가 있는 것 같다.
아직 완전 기초단계라 그런 것 같기도 하고.

오늘은 1번~12번, 15번, 18번의 알고리즘을 풀었다.
그 중에 리마인드가 꼭 필요하다고 생각한 알고리즘과 메소드 몇 가지에 대해 다뤄보려 한다.

스포가 있을 수 있으니 아직 안 풀어보신 분들은 뒤로가기!

사용 언어 : 자바스크립트

두 정수 사이의 합

문제설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

제한사항

a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.

입출력 예

abreturn
3512
333
3512

나의 풀이

a 랑 b 대소비교.
a가 작으면 a부터 b까지의 숫자를 더한다.
b가 작거나 같으면 b부터 a까지의 숫자를 더한다.

코드

function solution(a, b) {
  let answer;
  if (a >= b) {
    answer = b;
    for (let i = b + 1; i <= a; i++) {
      answer += i;
    }
  } else{
    answer = a;
    for (let j = a + 1; j <= b; j++) {
      answer += j;
    }
  }
  return answer;
}

본인 코드 리뷰

if 문 안에 answe = b, answer = a 주지 않고 for 문 안에서 i = b랑 i = a 로 해서 돌렸으면 더 깔끔했을 텐데 아쉬움이 남는 코드다.
제출할 때 항상 동작만 되면 냅다 제출했더니 코드들이 좀 더러운 면이 있는 것 같다..

다른 사람 코드

제출하고 다른 사람 코드를 보는데 감탄이 나온 코드가 있다.

unction adder(a, b) {
  var result = 0;

  return ((a + b) * (Math.abs(b - a) + 1)) / 2;
}

한 줄 만에 끝내다니,,,,;;
가우스의 공식을 응용한 것이다.
양 끝 합의 값과 합의 개수를 곱하여 a부터 b까지의 합을 구했다.

Math.abs() 함수는 주어진 숫자의 절대값을 반환합니다. x가 양수이거나 0이라면 x를 리턴하고, x가 음수라면 x의 반대값, 즉 양수를 반환합니다
출처 MDN

서울에서 김서방 찾기

문제 설명

String형 배열 seoul의 element중 Kim의 위치 x를 찾아, 김서방은 x에 있다는 String을 반환하는 함수, solution을 완성하세요. seoul에 Kim은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항

seoul은 길이 1 이상, 1000 이하인 배열입니다.
seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
Kim은 반드시 seoul 안에 포함되어 있습니다.

입출력의 예

seoulreturn
["Jane", "Kim"]"김서방은 1에 있다."

풀이

for문으로 soeul 배열의 길이만큼 돌린 후 해당 index 번호를 산출

코드

function solution(seoul) {
  let answer = "";
  for (let i = 0; seoul.length; i++) {
    if (seoul[i] === "Kim") {
      answer = `김서방은 ${seoul.indexOf("Kim")}에 있다`;
      return answer;
    }
  }
}

본인 코드 리뷰

너무 멍청하게 짠 코드,,
쓸데없는 코드가 많고, 복잡하게 짰다.(상당한 짬뽕코드가 돼버렸다.)
이것도 작동한다고 냅다 제출한 결과다..

위 코드는 for문을 돌렸기 때문에 indexOf라는 메소드를 쓸 필요 없이 i를 집어넣거나,
for문을 빼고 indexOf만으로 훨씬 간결하게 해결할 수 있던 코드였다.

앞으로는 로직을 확실히 구상하고 좀 더 간결한 방법이 있진 않은지, 돌아서 가고 있진 않은지 꼭! 고민해보고 제출해야겠다

풀면서 유용하게 사용한 함수, 메소드들

  • substring()
    substring() 메소드는 string 객체의 시작 인덱스로 부터 종료 인덱스 전 까지 문자열의 부분 문자열을 반환합니다.
    🎆 3번, 9번 문제에 사용
  • substr()
    substr() 메서드는 문자열에서 특정 위치에서 시작하여 특정 문자 수 만큼의 문자들을 반환합니다.
    🎆 3번 문제에 썼었음
    👎 그러나 앞으로 이 메소드는 쓰면 안됩니다. MDN 문서를 참고해주세요. substring 메소드로 대체하면 됩니다.
  • parseInt()
    parseInt() 함수는 문자열 인자를 구문분석하여 특정 진수(수의 진법 체계에 기준이 되는 값)의 정수를 반환합니다.(String -> Int)
    🎆 5번 문제에 사용
  • parseFloat()
    parseFloat() 함수는 문자열을 분석해 부동소수점 실수로 반환합니다.
    🎆 안 썼음. parseInt와 parseFloat, Number의 차이점에 대해 알자. 부동소수점/고정소수점도 공부하자.
  • push()
    push() 메서드는 배열의 끝에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다.
    🎆 11번 문제에 사용
  • indexOf()
    indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환합니다.
    🎆 18번 문제에 사용
  • Math.Floor()
    Math.floor() : 이 함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.
    🎆 3번 문제에 사용

출처 : MDN 홈페이지
코드 : 깃헙

마치며

나는 문제를 풀 때 대부분 if문과 for문을 사용하여 풀이를 했다.(근본)
그런데 다른 사람들을 보니 reduce, slice, map, repeat, 화살표 함수, 삼항 연산자 등 다양한 방법으로 훨씬 간결하게 풀고 있었다.(다 처음보는 거다 holy,,) 이러한 메소드들을 공부하여 다음부턴 적용할 수 있도록 노력해 봐야겠다.
(그리고 문제 제출하고 나면 다른사람들 풀이 보면서 자괴감이..)

profile
공부

0개의 댓글