조건문 코플릿 복습 및 의미 도출
배열
조건문 코플릿 복습 및 의미 도출
조건문 코플릿 중에는 매개변수에 월에 해당하는 수(1 ~ 12)를 입력하면
해당 월의 일수(28 or 30 or 31)를 리턴하는 함수를 작성하라는 문제가 있었다.
그 당시에 내가 푼 코드는 매월마다 if, else if로 조건을 넣어 일수를 리턴하는 방식이었다.
획기적으로 바꿀수는 없을까?
계산기 nightmare를 풀 때에도 if와 else if에 너무 많은 의지를 했었었는데 라며 생각할 때 그순간
계산기 reference코드의 OR연산자가 떠올랐고 이를 적용시켰다.
function daysInMonth(month) {
if(month === 2){
return 28;
}
if(month === 4 || month === 6 || month === 9 || month === 11){
return 30;
}
else{
return 31;
}
}
테스트 케이스를 넘기고 보니 reference와 내용이 동일하다.
OR(||)는 if와 else if의 조건을 통과할 때 공통된 값을 가질경우 조건문 자체를 많이 줄일 수 있는 방법인 것이다.
본인의 풀이와 reference를 비교하며 공부하던 중
위 예시 처럼 OR연산자를 활용해 획기적으로 코드를 줄일 수 있는 문제가 있었다.
우선 아래의 내가 쓴 코드를 보자.
function isPythagorean(side1, side2, side3) {
const newArr = Array.from(arguments);
if(Math.max(...newArr) === side1){
if(side1 * side1 === side2 * side2 + side3 * side3){
return true
}else{
return false
}
} else if(Math.max(...newArr) === side2){
if(Math.pow(side2, 2) === Math.pow(side1, 2) + Math.pow(side3, 2)){
return true
}else{
return false
}
} else if(Math.max(...newArr) === side3){
if(side3 ** 2 === side1 ** 2 + side2 ** 2){
return true
}else{
return false
}
}
}
side1, side2, side3 중에서 가장 큰 길이를 제곱한 값이 나머지 제곱값들의 합과 같은 함수를 구현하는 것인데,
나의 경우 세가지 변이 가장 클 경우 3가지를 모두 각각의 조건문에 넣어서 작성을 하였다. (비효율적이다.)
가장큰 길이의 제곱이 나머지 두변의 제곱의 합과 같다면 true를 리턴한다는 공통점이 있음에도
이것을 하나로 묶지 못했다.
function isPythagorean(side1, side2, side3) {
const pow1 = side1 * side1;
const pow2 = side2 ** 2;
const pow3 = Math.pow(side3, 2)
if(pow1 === pow2 + pow3 || pow2 === pow1 + pow3 || pow3 === pow1 + pow2){
return true;
}else{
return false;
}
}
하지만 reference에서는 각 변의 제곱 값을 미리 변수에 담아서
이것을 하나의 if문으로 그리고 OR를 통해 묶어서 해결하였다.
조건문 코플릿 중 또하나의 비효율의 극치이자 if와 else if로만 승부를 건 문제가 있었는데 하...
일단 코드를 보자.
function addOneSecond(hour, minute, second) {
if(hour >= 0 && 23 > hour){
//분단위 시작
if(minute >=0 && 59 > minute){
if(second >=0 && 59 > second){
second = second + 1;
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}else{
second = 0;
minute = minute + 1;
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}
}else{
if(second >=0 && 59 > second){
second = second + 1
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}else{ // 59분 59초
second = 0;
minute = 0;
hour = hour + 1;
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}
}
}else{//23시일때
if(minute >=0 && 59 > minute){
if(second >=0 && 59 > second){
second = second + 1;
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}else{
second = 0;
minute = minute + 1;
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}
}else{//59분일때
if(second >=0 && 59 > second){
second = second + 1
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}else{
second = 0;
minute = 0;
hour = 0;
return '1초 뒤에 '+ hour +'시 '+ minute +'분 '+ second +'초 입니다';
}
}
}
}
1초 뒤에 몇시에 되는지를 안내하는 string을 return하는 함수를 만드는 것이다.
정말 세밀하게도 짜놓았다. 정말 비효율 적이지만 이것도 재능이라면 재능인가
결국에는 풀기는 했다만 이 얼마나 비효율 적인가
조건문은 결국 효율을 위해서 쓰는 것이거늘!
아래 reference를 보고 많은 반성을 했다.
function addOneSecond(hour, minute, second){
if(second === 59){
second = 0;
minute = minute + 1;
}else{
second = second + 1;
}
if(minute === 60){
minute = 0;
hour = hour + 1;
}
if(hour === 24){
hour = 0;
}
return '1초 뒤에' + hour + '시 ' + minute + '분 ' + second + '초 입니다';
}
허무하다. 너무 짧고 간결하며 효율적이다.
딱 reference를 봤을 때 이해가 잠시 안되서 몇가지 의문점이 생각났다.
- second는 왜 60이 아닌 59를 조건으로 잡아놨지? 나머지는 60분 24시를 조건으로 잡았는데?
- 분단위와 시간단위에는 왜 else가 없을까?
곰곰히 생각한 결과 답을 유추해 낼 수 있었다.
- addOneSecond라는 함수는 1초뒤에 바뀐 시간을 return하는 함수인데 초의 경우 59일때 1초가 더해지면 60이되므로 바로 0으로 초기화가 되어야한다. 하지만 분의 경우 59분일때 59초가 아닌이상 60분이 되는 것이 아니므로 60으로 기준을 잡은 것이다. 24시의 경우는 분보다 더욱 마땅히 23시에서 1초가 지난다고해도 24시가 되는것이 아니기에 기준에 차이가 있는 것이다. 내가 짠 코드를 보면 59초일 경우와 아닌경우를 나누어서 59분 59초일 경우와 아닌경우를 또 나누어서 23시 59분 59초인 것을 또또 나누어서 모든 경우의 수를 다 집어넣었다. 하지만 0으로 초기화되는 기준을 각각 60분과 24시로 잡는다면 1초뒤의 값을 더 쉬운 코드로 구해낼 수 있는 것이다.
- 위의 대답으로 답변이 될 수도 있으나 한번 더 적어보겠다. 60분일때는 1초가 더해지면 60은 0이되야한다. 하지만 60분이 아닌 다른 분일때 1초를 더하면 초가더해지지 분이 더해지는 것은 아니다. 시간의 경우에도 그러하다.
코플릿을 복습하며 효율적으로 그리고 간단명료하게 코드를 짜는 능력이 얼마나 중요하고 그 능력이 내게 참 부족하다는 것을 다시금 느낄 수 있었다.
지속적인 복습으로 모두 나의 것을 만들자. 부족한 곳에 머무르지 말고 전진하자.
배열
-배열의 정의 : 배열은 순서가 있는 값
-배열에서의 element(요소), index(순서),
-배열을 만드는 법(대괄호와 콤마),
-배열을 조회하는 법(스트링과 유사[i]),
-배열의 값을 변경하는 법(조회 후 할당),
-이중배열,
-배열의 메소드 : 길이를 조회하는 법(length), 요소를 추가하는 법(push), 요소를 삭제하는 법(pop),
-배열과 반복문(배열의이름.length로 조건을 만들어서 반복문으로 배열의 요소를 활용)
-Array.isArray()로 배열을 확인
-배열의 메소드 : 배열의 뒷쪽에 요소를 push(추가), pop(제거) / 배열의 앞쪽에 요소를 unshift(추가), shift(제거)
-배열에 요소포함여부 확인 : .indexOf() 인덱스를 return, .includes() boolean을 return
'개인공부' 카테고리의 다른 글
2021년 5월 9일 클래스를 이용한 모듈화, 프로토 타입 예습 (0) | 2021.05.09 |
---|---|
2021년 4월 25일 TIL(호이스팅(Hoisting), spread/rest) (0) | 2021.04.25 |
2021년 4월 24일 TIL(koans 복습, 깊은 고찰: arguments.callee, 부족한 점 ) (0) | 2021.04.24 |
2021년 4월 10일 TIL (JS/Node 복습, coplit 깊은 탐구) (0) | 2021.04.10 |
[Javascript] callback 함수 (0) | 2021.04.06 |