Code States
Front-end boost camp
Today
I
Learned
🧚♂️ 반복문 어렵다. 오늘도 미세먼지 컨디션 최고~! 내내 환기하며 코딩해야지!
for (초기값; 조건식; 증감식) {
// 실행할 코드
}
-- 초기값 : 증감식 반복 횟수를 카운트하는 역할을 하는 변수. 초기값은 반복문의 코드블록 내부에서만 유효함
// 초기값(i)을 선언하고 1을 할당
for (let i = 1; 조건식; 증감식) {
console.log(i);
}
-- 조건식 : 코드블록 내부의 코드의 실행 여부를 결정, true일 경우 실행, false일 경우 반복문 종료
// i가 3보다 작거나 같을 경우 코드 실행, 3보다 클 경우 반복문 종료
for (let i = 1; i <= 3; 증감식) {
console.log(i);
}
-- 증감식 : 코드블록 내부의 코드를 실행한 후 초기값으로 선언된 변수를 증가 또는 감소시키기 위한 표현식
// 코드가 실행될 때마다 i가 1씩 증가
for (let i = 1; i <= 3; i++) {
console.log(i); // 1 2 3
}
let result = 0;
for (let num = 1; num <= 5; num++) {
result = result + num;
}
console.log(result); // 15
-- for문 내부에 num이라는 변수를 선언하고 1이라는 초기값을 할당한다.
-- 변수 num이 5보다 작거나 같은지 확인한다.
-- 2의 결과가 true면, 코드블록 내부의 코드를 실행한다.
-- 변수 num을 1 증가시킨다.
-- 2부터 4까지 반복한다.
-- 2의 결과가 false면, 반복문이 종료된다.
let str = 'codestates';
console.log(str[0]); // 'c'
console.log(str[4]); // 's'
let str = 'codestates';
console.log(str.indexOf('c')); // 0
console.log(str.indexOf('e')); // 3
let str = 'codestates';
console.log(str.length); // 10
let str = 'codestates';
for (let i = 0; i <= 9; i++) {
console.log(str[i]);
}
let str = 'codestates';
for (let i = 0; i <= str.length - 1; i++) {
console.log(str[i]);
}
// 예시 : 정육면체 주사위 두 개를 굴려서 나올 수 있는 모든 경우의 수
for (let i = 1; i <=6; i++) {
for (let j = 1; j <= 6; j++) {
console.log(`첫번째 주사위는 $(i), 두번째 주사위는 ${j}입니다.`);
}
}
결과 ▼
실행순서(코트 자료 친절하다) ▼
해설 :
-- 외부 반복문의 초기화와 조건식 평가 후 내부 반복문 실행
---> 내부 반복문의 조건식 평가가 false가 되면, 내부 반복문 종료 및 외부 반복문 조건식 평가가 이루어짐
---> 이때, 조건식 평가가 true면 다시 내부 반복문 순환하는 방식으로 진행
---> 외부 반복문의 조건식이 false가 되면 모든 반복문 종료
두 개 이상 중첩도 가능
// 2중 반복문으로 구구단 만들기
for (let i = 2; i <= 9; i++) {
console.log(`${i}단`);
for (let j = 1; j <= 9; j++) {
console.log(`${i} x ${j} = ${i * j}`);
}
}
let num = 0;
while (num < 3) {
console.log(num); // 0 1 2
num++
}
// 위 코드와 같은 for문
for (let num = 0; num < 3; num++) {
console.log(num); // 0 1 2
}
// 무한루프가 발생하는 코드 예시
let num = 1;
while (num > 0) {
console.log(num);
num++;
}
do {
console.log('코드블록 내부의 코드는 최소 한 번은 실행됩니다.')
// '코드블록 내부의 코드는 최소 한 번은 실행됩니다.'
} while (false)
▼ 결과
// for문을 사용하는 경우
- 반복 횟수가 비교적 명확할 때
- 배열, 문자열 내부를 순회할 때
- 반복문의 중첩이 필요할 때
// while문을 사용하는 경우
- 반복 횟수가 명확하지 않을 때
function sumTo(num) {
let sum = 0
for (let i = 0; i <= num; i++) {
sum = sum + i;
}
return sum;
}
--> return 걊이 for문 안에 있으면 실행하지 않는데. 이유는 반복하려고 하는데 return이 맥을 끊어버리고 반복말고 값이나 반환해! 라고 하는 것과 같기에, 반복문의 최종값을 얻기 위해서는 반복문 밖에 리턴코드를 쓴다.. 1번부터 막히쥬? ㅠ
// 왜 안되지... '-' 로 연결하는 부분을 넣어야하는데...
function makeDigits2(num) {
let i = 1;
let result = '';
while (i <= num) {
result = result + String(i);
i++;
}
return result;
}
// 무슨 짓을 한 것 같은지 모르겠는 내 코드
function makeMultiplesOfDigit(num) {
let result = '';
for (let i = 1; i <= num; i++) {
result = result + i;
if (result % 3 === 0) {
return result;
}
}
return result;
}
--> 나는 분명 i를 1부터 두고 전체 숫자의 나열을 만들고, 3의 배수만 남기고 싶었다.
// 내 의도에서 디벨롭해 완성된 코드
function makeMultiplesOfDigit(num) {
let result = '';
for (let i = 1; i <= num; i++) {
if (i % 3 === 0) {
result += String(i);
}
}
return result;
}
// 답안 레퍼런스 코드
function makeMultiplesOfDigit(num) {
let result = '';
for (let i = 1; i <= num; i++) {
if (i % 3 === 0) {
result += String(i);
}
}
return result;
}
function countCharacter(str, letter) {
let counter = 0;
for (let i = 1; i <= str.length; i++) {
if (str[i] === letter) {
counter += 1;
}
}
return counter;
}
function getMaxNumberFromString(str) {
let maxNum = 0;
for (let i = 1; i <= str.length; i++) {
if (parseInt(str[i]) > maxNum) {
maxNum = parseInt(str[i]);
}
}
return String(maxNum);
}
--> parseInt() : 숫자형을 문자형으로
function replaceAll(str, from, to) {
let result = '';
for (let i = 0; i < str.length; i++) {
if (str[i] === from) {
result += to;
} else {
result += str[i];
}
}
return result;
}
// 약수란? n으로 나누었을 때 나머지가 0이 되는 수 n
function getSumOfFactors(num) {
// 약수 ? n 으로 나눴을 때 나머지가 0인 수
let result = 0;
for (let i = 1; i <= num; i++) {
if (num % i === 0) {
result += i;
}
}
return result;
}
// 내 코드 : 제곱근 함수를 쓰지 않음
function isPrime(num) {
// 소수? 1과 자기 자신 외에 약수를 가지지 않는 1보다 큰 자연수
if (num === 1) {
return false;
}
if (num === 2){
return true;
}
if (num % 2 === 0)
return false;
for (let i = 3; i < num; i += 2) {
if (num % i === 0){
return false;
}
}
return true;
}
-- 나는 제곱근 구하는 함수 안쓰고 풀고 싶은데 왜 자꾸 테스트가 통과가 안되나 했더니, 마지막 'return true' 값을 밖으로 빼지 않고 for문 안에 둬서 'num = 12887'인 경우에서 자꾸 막혔다. if문 안에서 else {return true;} 로 받아줬는데 그럴 경우에, i = 3 인 경우부터 바로 true값이 반환돼 버림.
// 레퍼런스 코드 : 제곱근 함수 Math.sqrt() 를 씀
function isPrime(num) {
let sqrt = parseInt(Math.sqrt(num));
if (num === 1) {
return false;
}
if (num === 2) {
return true;
}
if (num % 2 === 0) {
return false;
}
for (let i = 3; i <= sqrt; i += 2) {
if (num % i === 0) {
return false;
}
}
return true;
}
▼ 아래부턴 어려운 문제...ㅠ 업데이트 중;
// 함수선언문으로 정의한 함수
function greeting () {
console.log('hello world')
};
// 함수표현식으로 정의한 함수
let greeting = function () {
console.log('hello world')
};
function greeting (name) {
console.log('hello ' + name);
}
--> greeting 이라는 함수가 name이라는 매개변수를 가지고 있다. 현재는 아무것도 할당되어 있지 않으므로 매개변수 name은 undifined으로 초기화 되어 있음.
--> 이 매개변수 name에 값을 할당하기 위해서는 어떻게 할까요?
function greeting (name) {
console.log('hello ' + name);
}
greeting('kimcoding'); // 'hello kimcoding'
--> kimcoding이라는 문자열이 함수 내부에서 매개변수 name에 할당됨
function add (x, y){
return x + y; // 반환문
console.log('실행되지 않습니다')
}
function add (x, y) {
return x + y; // 반환문
}
console.log(add(3, 2)); //5
function add (x, y) {
return x + y; // 반환문
}
let result = add(3, 2);
console.log(result); // 5
function add (x, y) {
return x + y; // 반환문
}
let result = add(3, 2) + add(5, 7);
console.log(result); // 17
못 다 푼 반복문 문제를 풀고 리뷰할 것이다... 아 고등학교 때 쎈수학 풀기 전 수학의 정석 챕터 맨 뒤 테스트 문제 푸는데 막혀서 열받는 느낌이다. 쎈수학도 안갔는데 벌써 막힌다고 현타오는 느낌~ 이지만! 어쩌겠어 해야지 ㅋ 오늘 저녁은 반복문 문제 리뷰당ㅋ
and! 디버깅 사용해보기!
1) 개발자 도구 실행 (F11 / opt+cmd+i / 설정)
2) debugger; 키워드를 함수 호출 전에 입력
아! 나두 노력없이 비열하게 코딩 잘해지고 싶어
짤방이 웃겨요! 화이팅입니다^^7