어떤 특정한 조건이 거짓으로 판별될 때까지 반복하는 반복문
for (초기식; 조건식; 증감식) {
// 반복 실행될 코드 블록
}
- 초기식 : 반복문이 시작될 때 한 번 실행되는 초기식
보통 반복을 위한 변수들을 초기화한다.- 조건식 : 각 반복마다 평가되는 조건식
조건식이 참(true)이면 코드 블록이 실행되고, 거짓(false)이면 반복이 종료된다.- 증감식 : 각 반복이 끝난 후 실행되는 식으로, 보통 반복 변수를 증가시키거나 감소시킨다.
// i++ = i=i+1
for (let i=1; i<=10; i++){
console.log("hi!",i);
}
코드의 결과는 hi! 라는 문구가 10번 출력된다.
for(let i=1;i<=10; i++){
if(i%2==0){
console.log(i)
}
}
// 2,4,6,8,10
for (let i = 1; i <= 10; i += 2) {
console.log(i)
}
// 1,3,5,7,9
💡 ( 예시2와 예시3 중 실행속도가 좀 더 빠른 건 예시3이다.
예시2는 for문 안에서 if문을 추가적으로 거치기 때문에 예시3보다는
비효율적인 코드지만 어떤 경우에 쓰냐에 따라 필요한 것을 골라서 쓸 줄 알아야 할 것 같다.
실제 프로젝트를 할 땐 어떤 코드가 효율적인지에 대해서도 고려를 해보자 ! )
구구단 표현하기
for(let i=2;i<=9;i++){
for(let j=1;j<=9;j++){
console.log(i+"*"+j+"="+i*j)
}
}
for문은 배열이랑 자주 같이 활용된다.
let fruit = ["banana","apple","grape","mango"]
for(let i=0;i<fruit.length;i++){
console.log(fruit[i])
}
length 속성은 배열의 길이를 반환
어떤 조건문이 참이기만 하면 문장을 계속해서 수행하는 반복문
let a = 1
while(a<=10){
console.log("while문 실행",a)
a++;
}
반복문 종료
for (let i = 0; i < 10; i++) {
console.log(i);
if (i === 5) {
break; // i가 5일 때 반복문을 중단함
}
}
결과 : 0,1,2,3,4,5
주어진 조건에 따라 특정 반복을 건너뛰고 다음 반복을 수행하고 싶을 때 사용
현재 또는 레이블이 지정된 루프의 현재 반복에서 명령문의 실행을 종료하고
반복문의 처음으로 돌아가여 루프문의 다음 코드를 실행한다.
let i = 0;
while (i < 10) {
i++;
if (i === 5) {
continue; // i가 5이면 건너뛰고 다음 반복 수행
}
console.log(i);
}
결과 : 1,2,3,4,6,7,8,9,10
let sum = 0
for(let i = 1; i<=100; i++){
sum += i
}
console.log(sum) // 5050
for (let i = 1; i <= 100; i += 2) {
console.log(i)
}
여기까진 어렵지 않게 풀었는데
3,4번은 나에게 어려웠다 😭
특히 3번쓰 ...
3. 1 ~ 50까지 숫자중 369 결과 출력하기
for (let c = 1; c <= 50; c++) {
let result = ''; // 결과 문자열 초기화
let num = c; // 현재 숫자 저장
// 현재 숫자에 포함된 3, 6, 9의 개수를 세는 반복문
while (num > 0) {
if (num % 10 === 3 || num % 10 === 6 || num % 10 === 9) {
result += '짝'; // 3, 6, 9에 해당하는 경우 '짝' 추가
}
num = Math.floor(num / 10); // 다음 자릿수로 이동
}
// '짝'이 추가되지 않은 경우에는 숫자를 그대로 추가
if (result === '') {
result = c;
}
console.log(result); // 결과 출력
}
이건 gpt샘이 내어준 답변이라 내가 온전히 이해되지 않았다.
먼저 스터디 선생님의 풀이 영상을 보면서 다시 접근한 후 gpt 방법을 다시
보면 이해가 좀 더 될 것 같다.
쪼개서 접근하면 우선 1 ~ 50까지 출력하는 for문을 작성하면 이렇다.
for (let i = 1; i <= 50; i++) {
console.log(i)
}
해야 할 건 3,6,9 ... 가 들어가면 짝 / 33, 36, 39는 짝짝
이런 식으로 되게 해야 한다.
일단 이걸 보고 숫자를 문자로 분리해서 비교해야 한다는 걸 이해해야 할 것 같다.
33,36,39 와 같이 짝이 2번씩 나오게 해야 하는건 두자리 수를 문자열로 변환해
각 문자에 3,6,9가 있는지 판별하게 하자
for (let i = 1; i <= 50; i++) {
let convertStr = i.toString()
let result = ""
for (let j = 0; j < convertStr.length; j++) {
if (convertStr[j] === "3" || convertStr[j] === "6" || convertStr[j] === "9") {
result += "짝"
}
}
}
여기서 convertStr 이란 변수에는 toString()이라는 메서드를 사용해
숫자를 문자열로 변환한 값을 저장한다.
33 - > "33" 이렇게 된다.
결과를 저장할 result 변수를 선언한다.
for문을 하나 더 열어 이번에는 변환한 문자열의 길이만큼 반복하며
3,6,9인지 확인하는 조건문을 추가한다.
여기서 반복될 j는 문자의 인덱스값을 의미하게 된다.
예를 들어 36이면 인덱스가 [0] = 3 , [1] = 6 이 되어 조건과 비교한다.
조건에 만족한다면 결과를 저장할 result 변수에 "짝" 을 더한다.
result = "짝" 이 아니라 result += "짝"이 되는 이유는
33,36,39와 같이 "짝짝"이 되어야 하는 경우에
"33"이 반복문 안에 들어가면 첫번째 문자인 3을 비교하여
result에 짝이 들어가게 되고 두번째 문자인 3을 비교하여
이미 result에 "짝"이 있는 상태에서 추가로 "짝"이 들어가야
원하는 답을 얻을 수 있었다.
이후 안에 있는 for 반복문이 종료된 뒤
for (let i = 1; i <= 50; i++) {
let convertStr = i.toString()
let result = ""
for (let j = 0; j < convertStr.length; j++) {
if (convertStr[j] === "3" || convertStr[j] === "6" || convertStr[j] === "9") {
result += "짝"
}
}
console.log(result.length > 0 ? result : i)
}
결과를 출력할 때 삼항 연산식을 활용하여
result.length의 길이가 0보다 크다면
문자를 하나라도 갖고 있다는 뜻이므로 result를 출력하고
아닐 경우엔 3,6,9에 해당하지 않으므로 숫자 i를 출력하게 한다.
얏호 !!
다시 생각해보면서 코드 하나씩 들여다보니까 더 좋은 것 같다.
이걸 풀고 다시 gpt의 답변을 보니까 이해가 더 잘 되어서 앞으로도
이것저것 찾아보면서 하나씩 풀어가면 좋을 것 같다.
4. 주어진 숫자가 소수이면 true/아니면 false 반환하기
일단 소수란
2, 3, 5, 7, 11, 13 ... 처럼
1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수를 말한다.
function isPrime(num) {
for (let i = 2; i<num; i++) {
if (num % i === 0) { //num이 다른 수로 나눠떨어진다면 소수가 아니다.
return false;
}
}
// 소수는 1보다 큰 양의 정수라는 것도 만족해야 함.
// 1보다 작으면 false를 리턴한다.
return num > 1;
}
console.log(isPrime(12)) // false
for 루프의 시작을 i = 2로 초기값을 설정하는 이유는
소수를 판별할 때 1과 자기 자신을 제외하고 나누어지는 수가 있는지 확인해야 하므로
반복문에서 i 값을 2부터 시작하게 되는 것이다.
1로 나누는 것은 항상 가능하기 때문에, 1은 제외하고 시작하는 것이며
이렇게 하면 반복문에서 i가 2부터 시작하여 주어진 숫자를 2부터 차례대로 나누어 소수인지를 판별할 수 있게 된다.
만약 나누어떨어지는 수가 있으면 소수가 아니므로 false를 반환하고 그렇지 않으면, 반복문이 종료되고 return num > 1; 조건이 실행되어 주어진 숫자가 1보다 크다면 true를 반환하여 소수 여부를 판별한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Loops_and_iteration
+++
for (let c = 1; c <= 50; c++) {
// 현재 숫자에 포함된 '3', '6', '9'의 개수를 세는 변수 초기화
let count369 = 0;
// 숫자를 문자열로 변환
// 각 자리마다 '3', '6', '9'가 포함되어 있는지 확인하고 개수 세기
let numStr = c.toString();
for (let i = 0; i < numStr.length; i++) {
if (numStr[i] === '3' || numStr[i] === '6' || numStr[i] === '9') {
count369++; // '3', '6', '9'가 포함된 경우 count369 증가
}
}
// 삼항 연산자를 사용하여 결과 설정
let result = (count369 === 1) ? '짝' : (count369 === 2) ? '짝짝' : c;
console.log(result); // 결과 출력
}
그리고 처음 while문 사용한 방법이랑 이 방법의 효율성에 대해 궁금해서
gpt에게 질문하고 받은 답변
뭔가 문제를 풀 때 효율적인 것에 대한 것보다는 어떻게 결과를 도출하느냐에만
초점이 갔었는데 스터디를 하면서 다른 사람들이 푸는 방식이나
내가 생각지 못한 것들을 다시 생각하게 하면서 뭔가 코드의 효율성이나
다른 측면도 고려해야 한다는 것을 이해하게 되었다.
추후에 프로젝트할 때 코드를 구현하는 것에 그치지 않고 여러 측면에서
바라보는 힘을 기를 수 있게 하자 !!