💡 이 포스트에는 Unit 3. javascript 기초 제어문 - 조건문, 문자열의 코딩문제를 풀고 몰랐던 점이나 부족했던 점을 정리했다!
(누군가에게는 너무 쉬워 하품이 나올 수 있습니다.🥲)
핵심 : 비교 연산의 결과를 boolean형태로 리턴할 때 바로 리턴할 수 있다.
변수를 선언해서 할당한 후, 그 변수를 리턴했는데, 바로 리턴하는 방법을 미처 생각을 못했다.
let num1=3, num2=7;
//num1이 num2보다 큰 결과를 boolean 형태로 출력하세요.
//기존의 답
let result=num1>num2;
return result;
//수정한 답
return num1>num2;
핵심 : 짝수는 2로 나눈 나머지가 0인 경우이다. (ex. myNum%2===0 이 true면 짝수)
핵심 : 조건1, 조건2, 둘 다 만족하는 경우, 각각에 대해 내용을 작성할 때 둘 다 만족하는 조건부터 작성한다.
조건1인 경우, 조건2인 경우, 조건1과 조건2에 모두 해당하는 경우, 모두 아닐 경우가 있을 때는
/*
5의 배수인 경우 '5의 배수입니다',
6의 배수인 경우 '6의 배수입니다',
5와6의 배수인 경우 '5와 6의 배수입니다',
둘 다 아닌 경우 '5의 배수도, 6의 배수도 아닙니다'를 결과를 출력하세요.
*/
//임의의 수 myNum
if (myNum % 5 === 0 && myNum % 6 === 0) {
return '5와 6의 배수입니다';
} else if (myNum % 5 === 0) {
return '5의 배수입니다';
} else if (myNum % 6 === 0) {
return '6의 배수입니다';
} else {
return '5의 배수도, 6의 배수도 아닙니다';
}
핵심 : Math.pow(제곱의 밑, 지수) 또는 "제곱의 밑**지수"
만약 4의 3제곱이면 Math.pow(4,3) 또는 4**3으로 표현한다.
핵심 : 각 시, 분, 초가 더해서 0이 되었을 경우를 조건문으로 처리한다.
조건문을 제대로 처리하지 못해서 문제를 틀렸다.
59초에서 1을 더하면 0이 되고 분에 1을 더하는데 조건문을 중첩으로 처리했었다. 중첩으로 처리했어도 테스트를 통과하긴 했다.
(분, 시가 각각 60, 24가 되는 경우는 모두 초에 1을 더했기 때문에 생긴 상황이라고 생각했다.)
다만 59보다 작은데 1초만 더하는 경우를 놓치고 말았다.
//nowSecond, nowMinute, nowHour 각각 시, 분, 초
//개선된 풀이
if (nowSecond === 59) {
nowMinute += 1;
nowSecond = 0;
} else {
nowSecond += 1;
}
//분을 판단하는 조건문을 중첩 아닌 개별 처리
if (nowMinute === 60) {
nowHour += 1;
nowMinute = 0;
}
//시를 판단하는 조건문을 중첩 아닌 개별 처리
if (nowHour === 24) {
nowHour = 0;
}
핵심 : Boolean()에 인자를 넣으면 논리값으로 변환된다.
핵심 : NaN===NaN 은 true가 아니다.
1. falsy값을 몰랐던 건 아니었지만, Boolean()을 몰랐다.
만약 해당값이 falsy인 경우 true를 리턴하려면 !Boolean(값) 이런식으로 Boolean()결과에 !(not 연산자)를 붙여서 입력해야 했다.
2. 이외에 문제를 풀다 NaN===NaN이 true가 아님을 발견했다. 찾아본 결과 NaN을 판별하려면 isNaN을 써야한다.
핵심 : 수1, 수2, 수3 중에서 작은 값을 비교하려면 일단 작은 값을 정해놓는다. 그리고 차례대로 차근차근 판별한다.
말이 쉽지 사실 잘 보고 이해될 때까지 계속 읽었다.
만약 수가 많아지면 어떻게 해야할지 참 고민이 된다......(나중에 공부할 예정)
일단 의사코드를 정리해본 결과
1. 제일 작은 값을 먼저 정해놓고
2. 수1 vs 수2, 수1 vs 수3, 수2 vs 수3 등 모든 비교를 적는다.
3. 각 비교의 결과(제일 작은 값, 변동여부)를 모두 적는다.
4. 이 과정을 '반대'의 경우, '변동없음'을 구분 및 삭제하며 정리한다.
//의사코드
/*
1. 일단 수1을 제일 작은 수로 설정 smallest=수1
2. 비교, 3. 결과 적기
2-1. 수1 vs 수2
- 수1>수2 : smallest=수2 -> 2-2 로
- 수1<수2 : smallest=수1 (변동없음) -> (수1vs수3 필요) 2-3 로
- 수1=수2 : smallest=수1 (변동없음) -> (수1vs수3 필요) 2-3 로
2-2. 수2 vs 수3 (수1>수2 인 상태)
- 수2>수3 : smallest=수3 -> 끝.
- 수2<수3 : smallest=수2 -> 끝.
- 수2=수3 : smallest=수2 -> 끝.
2-3. 수1 vs 수3 (수2>=수1 상태)
- 수1>수3 : smallest=수3 -> 끝.
- 수1<수3 : smallest=수1 (변동없음)
- 수1=수3 : smallest=수1 (변동없음)
*/
/* 4. 의사코드-위의 과정을 정리하면 이렇게 된다.
//일단 수1을 제일 작은 수로 설정 smallest=수1
//비교
- 수1>수2 : smallest=수2
-> 수2>수3 : smallest=수3 -> 끝.
- 그 외
-> 수1>수3 : smallest=수3 -> 끝.
*/
let smallest=num1
if(num1 > num2){
smallest = num2;
//3. 수2와 수3중에서
if (num2 > num3) {
smallest = num3;
}
}else{
if(num1>num3){
smallest = num3;
}
}
return smallest;
핵심 : 전체 문자열은 백틱(₩₩)으로 감싼 뒤 표현식 부분만 ${} 안에 작성한다.
+연산자로 연결하는 것보다 백틱으로 표현하니 더 편했다.
let year=2022, month=8, today=23;
let str=`내일 날짜는 ${year}년 ${month}월 ${today+1}일 입니다.`
console.log(str); //오늘 날짜는 2022년 8월 23일 입니다.
핵심 : 분(minute) 단위의 값을 시간, 일수로 표현할 때 Math.floor()를 사용하면 보다 간단하게 표현할 수 있다.
예전에는 나머지 연산으로 복잡하게 구했었다.(전체 값-나머지 값, 구한 후 나누기..)
하지만 Math.floor()를 사용하니 좀 더 간편하게 구할 수 있었다.
let hour, day; //minute는 임의의 분 값
//기존 풀이
hour=(minute-minute%60)/60;
day=(minute-minute%(24*60))/(24*60);
//바뀐 풀이
hour=Math.floor(minute/60);
day=Math.floor(minute/(60*24));
이미 잘 알고 있다고 생각한 개념도 막상 알고리즘 문제로 나오면 잘 틀리기도 하고 막막하기도 했다. 공부하면서 아래와 같은 노하우가 생겼다.
1. 귀찮더라도 의사코드를 계속 작성한다.
2. 모르는 문제는 길게 고민하다 좌절하지 말고 정답을 본다.
3. 모르는 개념, 몰랐던 개념은 적극적으로 찾아본다.
시간이 좀 걸리긴 했지만 이 3가지를 생각하며 풀어보니 많이 도움이 되었고
마지막으로 이 포스트처럼
4. 몰랐거나 새롭게 알게 된 내용들을 정리한다.
이렇게 작성해보니 자동적으로 복습이 되어 앞으로는 더 잘 풀릴 것 같은 느낌이 든다.