항해 99

항해 99 5기 TIL_5

Dream Herb 2022. 1. 14. 14:46

▶ Today I Learned

<알고리즘 기초>

 

https://programmers.co.kr/learn/courses/30/lessons/12903?language=javascript

[가운데 글자 가져오기]

단어의 가운데 글자를 반환하는 함수, solution 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

 

let word = "123456789" // 출력할 임의의 문자열

// 문자열의 길이를 구한 후 이를 2로 나누어 나머지가 없으면 짝수, 있다면 홀수
if (word.length%2 == 0) {
   let start_index = word.length/2
   //문자열의 길이를 2로 나누면 문자열에서 중간정도 위치 값을 구할 수 있음
   
   위 숫자를 substring()에 대입
   substring은 특정 문자열의 특정인덱스 부터 특정 인덱스의 전까지 출력됨
   ex) 문자열 "사과나무"
   "사과나무".substring(0,2) = "사과"
   
   console.log(word.substring(start_index-1,start_index+1 )); //배열의 시작은 0부터이기에 짝수인 경우
   위와 같이 코드를 작성하면 중간의 두 문자가 출력됨
} else {
  let start_index = Math.floor(word.length/2) // Math.floor()는 소수점 부분을 내림해주는 함수
	substring에 들어갈 인덱스는 문자열의 순서를 나타내므로 0이상의 정수가 와야하기 때문!
    
  console.log(word.substring(start_index,start_index+1)) //배열의 시작은 0부터이기에 홀수인 경우
   위와 같이 코드를 작성하면 중간의 한 문자가 출력됨
}

이를 프로그래머스에 제출한 것

 

s 파라미터로 시작하길래 형식에 맞춰 제출했다. 자바 이후 오랜만에 보는 return 구문

 

 

cf) substring(출력시작 인덱스, 종료인덱스), 여기서 주의할 점은 출력이 종료인덱스까지가 아닌 종료인덱스의 바로 전 까지만 이루어진다는 것.

 

cf) 호이스팅, 이전 문제 해결 시 콘솔에 undefined라고 뜬 게 호이스팅이었다...!

변수가 초기화 단계를 거쳤지만 값이 할당되지는 않은 상태에 undefined가 나타난다.

var과 let/const의 초기화 시점은 다르다. var는 변수선언과 동시에 초기화, 그러나 let/const는 선언 하여도 코드가 실제로 선언문에 도달하여야 초기화가 됨, 그 전에 변수참조가 일어나면 Reference Error가 발생한다.

 

하단의 링크를 참조하면 도움이 될 듯 하다.

https://hanamon.kr/javascript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85%EC%9D%B4%EB%9E%80-hoisting/#:~:text=%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85%EC%9D%80%20%EC%BD%94%EB%93%9C%EA%B0%80,%EA%B2%83%20%EA%B0%99%EC%9D%80%20%ED%98%84%EC%83%81%EC%9D%84%20%EB%A7%90%ED%95%9C%EB%8B%A4.&text=%EC%BD%94%EB%93%9C%20%EC%8B%A4%ED%96%89%20%EC%A0%84%20%EC%9D%B4%EB%AF%B8%20%EB%B3%80%EC%88%98,%EB%82%98%EC%99%80%EB%8F%84%20%EC%98%A4%EB%A5%98%20%EC%97%86%EC%9D%B4%20%EB%8F%99%EC%9E%91%ED%95%9C%EB%8B%A4.

 

cf) 다른 사람의 풀이 중에 매우 아름다운 코드가 있었는데 그중 ? 기호가 있었다.

알고보니 이는 삼항 연산자였다. 삼항 연산자는 {조건문? True일 시 작동 : false일 시 작동} 형태로 구성되어 있다. 이제 한번 씩 활용해보아야지 ㅎㅎ

 

[두 정수 사이의 모든 정수 합 구하기]

https://programmers.co.kr/learn/courses/30/lessons/12912

 

function solution(a, b) {

let c = 0 // 반복문에서 특정 값을 받기 위한 도구
    if (a<=b) {
        for (a ; a<b + 1 ; a++) {
        // a<=b 라는 조건을 걸게되면 아래에서 a=b인 조건이 하나더 필요!
        ex) a = 5, b = 5라면 증감문이 a<=b일 때 함수가 작동하지 않음
        // 코드를 줄이고자 b에 1을 더해버림!
        c = c + a 
    
        }
        return c;
} else {

        for (b; b < a + 1 ; b++) {
        // a = 5, b = 4 일때 증감문 조건이 b<a라면 a값을 포함 시킬 수 없음,
        // 그래서 1을 더함
            c = c + b
  } 
        return c;

}
}

 

+ 어렸을 적 책으로 보았던 가우스 덧셈이 생각났다. 다만 이를 함수로 바로 나타내보진 못했었다.

 

https://www.instiz.net/pt/5560215

해당 링크 속 그림을 참조하면 쉽게 이해할 수 있다.

 

(양끝수의 합)*(숫자의 처음부터 끝까지 갯수)나누기 2를 하면 된다

ex)

a = 3

b = 5

 

(a+b)(b-a+1)/2 = 12, 3+4+5를 한 것과 같다.

따라서 답은 아래의 코드다?

 

function solution(a, b) {
    return a == b ? a + b : (a+b)*(b-a+1)/2
}

그렇지 않다.. 이 경우는 두 정수가 음의 정수가 아니면서 서로 같지 않아야만 제대로 작동한다..

 

그렇다면 어떻게 할까?

 

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

=> 프로그래머스에 올라온 답 중 가장 인기 답변이었다. 매우 깔끔..

 

위 알고리즘의 오류를 피하기 위해 a와 b의 절대값 차이를 두었다.

Math.abs()는 두 값의 절대 값을 반환하는 자바스크립트의 함수이다.

 

▶ 느낀 점

똑같은 알고리즘 이라도 푸는 방법은 천차만별이고 여러 함수와 개념을 사용한다. 누구는 코드를 몇십 줄을 짤 때, 누구는 단 몇 줄로 구현한다. 변수명을 적더라도 누군가는 짧고 명확하게 작성한다. 문제를 제출하고 프로그래머스 내 모범 답안을 보았을 때, 팀원들과 자신만의 풀이를 공유하였을 때, '아, 저렇게도 풀 수 있구나..'를 여실히 느꼈다. 리팩토링이라는 작업이 이래서 필요한 가 보다. 앞으로는 단순히 문제를 푸는 것을 넘어서서 관련 개념에는 무엇이 있고 어떤 특징을 가지고 있는 지, 어떻게 하면 더 효율적으로, 쉽고 명확하게 코드를 짜고 문제를 해결할 수 있는지 고민해 보아야겠다. 오늘 하루도 수고많았다! 내일도 화이팅팅 :)

 

 

▶ 공부 시 참고 링크들

 

https://wdevp.tistory.com/59

 

javascript 소수점 버림, 올림, 반올림

# 자바스크립트 숫자 타입의 값 버림, 올림 등 다양한 방법 다른 언어들 처럼 숫자를 쉽게 변환할 수 있는 편리한 함수가 자바스크립트에서 존재하며 이때는 Math 객체를 사용합니다. 아래는 Math

wdevp.tistory.com

 

https://curryyou.tistory.com/192

 

[자바스크립트] 변수 선언 방식 차이: var / let / const

자바스크립트의 변수 선언은 var로만 가능했으나, ES6(ES2015)부터 let과 const가 추가 되었다. 옛날의 var가 최신의 let(변수), const(상수)로 분리되었다고 생각할 수 있으나, 내부 사정은 상당히 다르

curryyou.tistory.com

 

https://blog.fakecoding.com/archives/js-question-mark/

 

[JS] 물음표(?) 기호의 사용

안녕하세요. Javascript 에서 ? 기호의 의미와 사용방법에 대해 알아보겠습니다. ? 기호는 콜론기호(:) 와 함께 삼항 연산자으로 사용합니다. 삼항연산자 조건부 삼항 연산자는 JavaScript에서 세 개의

blog.fakecoding.com

 

https://ko.javascript.info/types

 

자료형

 

ko.javascript.info

 

https://jihyehwang09.github.io/2019/03/12/js-return-and-break/

 

JavaScript에서 return과 break의 차이

JavaScript에서 return과 break의 차이 JavaScript로 코드를 짜면서 for문과 switch문을 작성할 일이 있었다.return과 break가 비슷한 역할을 하면서도 미묘한 차이가 있다는 사실은 알지만,명확하게 무엇이 다

JihyeHwang09.github.io