2022.4.27. (수)
1. 오늘의 소감
- 힘들었지만... 뿌듯하다!
- 조건문 코플릿이 뒤로갈수록 난이도가 급상승! 하는 바람에 진땀을 뺏다. 분명 쉬워보였는데 테스트 실행시켜보면 빨간색이 범람하고...😢 가령 점수에 따라 A ~ F까지 등급을 메기는 문제의 경우, 100초과 0 미만을 값들을 처음에 안 걸러줘서 조건식이 꼬였다. 레퍼런스 코드를 보고나니 큰 깨달음을 얻었다.(즉, 예외처리를 초반에 해버리자!) 이것만으로도 복잡한 코드가 많이 단순해진다. 그리고 if 문에서 else 를 굳이 난발할 필요 없다. if 문 안에 return 이 있는 경우, 다음 조건문에 굳이 else를 안써도 잘 작동한다. 가독성도 더 좋고.
- 처리할 필요 없는 예외값들은 미리 처음부터 조건식을 써서 걸러버리는 게 깔끔한 코드의 지름길이라는 것.
- 그 외에도 나를 괴롭혔던 문제 두가지.
- 피타고라스 정리를 이용해서 직각 삼각형 찾아내는 문제
- || 연산 없이 &&와 !만으로 OR 구현하기...
- 피타고라스 직각삼각형 문제
→ ‘가장 긴 변의 제곱 = 나머지 두 변 제곱의 합’ 공식으로 직각 삼각형 여부 판별
function isPythagorean(side1, side2, side3) {
// TODO: 여기에 코드를 작성합니다.
side1 = side1 * side1
side2 = Math.pow(side2, 2);
side3 = side3 ** 2;
//내가 고민했던 부분을 이렇게 하나의 조건문으로 처리해버리다니...
if(side1 === side2 + side2 || side2 === side1 + side3 || side3 === side1 + side2){
return true;
}
return false;
}
- || 연산 없이 &&와 !만으로 OR 구현하기
→ 이 경우, 내 생각대로 다시 한번 풀어봤다.
//레퍼런스 풀이
function or(expression1, expression2) {
if (expression1 === true && expression2 === true) {
return true;
} else if (expression1 === true && expression2 !== true) {
return true;
} else if (expression1 !== true && expression2 === true) {
return true;
} else if (expression1 !== true && expression2 !== true) {
return false;
}
}
//내 풀이.
//두 표현식 값이 다르면 어차피 true인걸 이용해서 풀었다.
//물론 입력값이 boolean 으로 걸러져서 들어온다는 전제하에
function or(expression1, expression2) {
// TODO: 여기에 코드를 작성합니다.
if(expression1 !== expression2) return true;
if(expression1 === expression2 && expression1 === true){
return true;
} else {
return false;
}
}
2. 학습한 키워드
- 조건문, if, else if, else, 비교연산자(> < === ), == 와 ===, 논리연산자, AND(&&), OR(||), NOT(!), falsy, truthy, falsy 한 값 6가지 ( false, null, undefined, NaN, 0, ‘’ ), string 문자열 다루는 메소드들, str.length, str.concat(), str.indexOf(), str.lastIndexOf(), str.includes(), str.substring(start, end), str.slice(start, end), str.toUpperCase(), str.toLowerCase(), str.split(seperator), immutable, mutable
3. 키워드를 바탕으로 학습 내용 설명해보기
- 중요했고, 새롭게 알게 된 것 위주로 적겠다. 자세한 내용은 이미 다른 페이지에 정리했으니까.
- 절대 ==, != 비교는 하지 말자! 왜냐고? 예외가 너무 많다. 항상 === 로 엄격한 비교를 해야한다.
- ! 연산자는 논리값 앞에 쓴다. !false 이렇게. 그리고 중복으로 써도 된다. !!false === false, !!!false === true
- falsy 한 값 6가지 ( false, null, undefined, NaN, 0, ‘’ )
- falsy 한 값 6가지 제외 나머지는 truthy다.
- 특히, 0이 아닌 숫자, 빈문자열이 아닌 모든 문자열, 모든 배열(빈 배열도), 모든 객체(빈 객체도) 모두 다 truthy 한 값이다.
- string 은 immutable(불변하는) 하다. 즉, 원본이 바뀌지 않는다. (완전 중요!)
- 따라서 str[2] = ‘a’; 해도 str 값은 바뀌지 않는다.
- str에 값을 재할당 하지 않는 이상, 값이 바뀌지 않는다.
- string의 모든 메서드들도 immutable 하다! 원본을 바꾸지 않고, 해당 값만 반환한다. 그래서 그 반환값을 쓰려면 변수에 저장해줘야한다. (완전 완전 중요!)
- string 과 달리, array의 메서드는 immutable 와 mutable이 섞여있어 구분 필요.
- str.indexOf(searchValue)는 원하는 문자열이 있는 ‘처음' 위치(인덱스) 반환한다. 같은 문자열이 두 개 있어도 앞에거 인덱스를 반환한다.당연히 대소문자 구별하며, 해당 문자열이 없으면 -1을 반환한다.
- str.lastIndexOf(searchValue)는 뒤에서 부터 찾는다.
- str.includes(searchValue) 는 위 두 개와 달리 인덱스 값이 아닌 포함여부(true, false) 를 반환한다. IE 같은 구형 브라우저에서는 작동 안 한다.
- str.split(seperator) 는 csv 형식 문서 처리에 유용하다. 반환 값은 배열이다. 꽤 유용하게 쓰일 메소드.
- str.substring(start, end) 는 시작 인덱스와 끝 인덱스 사이의 문자열을 반환한다. 두 인자 위치가 바뀌어도 상관없다! 끝 인덱스 문자는 포함하지 않는다. 시작 인덱스 ~ 끝 인덱스 바로 앞 문자 까지. 음수 인덱스는 0으로 취급한다. 주의해야 할 건 비슷한 기능의 str.slice()나 str.substr() 에서 -1은 맨 마지막 인덱스를 뜻한다. (의미가 완전 다르다!)
- str.substring(start, end) 는 두 인덱스 ‘사이'의 문자열 을 빼온다고 생각하면 쉽다. 그래서 두 인자가 바뀌어도 상관이 없는 것. 물론 끝 인덱스 포함 안되는 건 유의하자.
- str.toUpperCase() 와 str.toLowerCase() 는 대소문자 상관없이 두 문자열이 같은지 비교할 때 유용하다.
4. 어려웠던 키워드
- 왜 == , != 를 쓰면 안되는 지에 대한 이유정도만 정리해두면 될 것 같다.
→ 1 == ‘1’ //true
→ 예외 케이스가 많아서, 엄격한 비교가 안 되기 때문이다.
728x90
반응형
'TIL' 카테고리의 다른 글
[TIL] #5. CSS 셀렉터 (0) | 2022.12.01 |
---|---|
[TIL] #4. HTML (0) | 2022.11.28 |
[TIL] #3. 이중 반복문 (0) | 2022.11.26 |
[TIL] #1. 첫 페어 프로그래밍 (0) | 2022.11.21 |
이전 TIL 포스팅 공지 (#1부터 #30까지) (0) | 2022.11.19 |