for
let 반복요소;
for(let i = 초기값; i <= 조건; i= i+증감){
반복요소 = 반복요소 + i;
//(또는)
어떠한 반복내용
}
while
let 반복요소;
let 초기값 = 초기할당값;
while(i<=조건){
반복요소 = 반복요소 + i;
//(또는)
어떠한 반복내용
i = i + 증감;
}
for
과 while
의 가장 큰 차이는 초기값과 증감문의 필수 여부이다.오늘은 pseudo code를 좀 더 신경써보겠따.
Q1. 문자열에서 '#'의 인덱스를 리턴
- '#'이 없는 경우
undefined
리턴
function findTheHashtag{
for(let i=0; i<word.length; i++){ //입력받은 문자열의 첫 인덱스부터 끝까지 확인하겠다
if(word[i] === '#'){ // 각 인덱스의 문자가 #인지를
return i; // 만약 그렇다면 그 인덱스 번호를 반환하자
}
} return undefined; // 모든 인덱스를 둘러봐도 없으면 undefined를 반환한다
}
Check 👉🏾 이게 웬만한 반복문의 근간이 되더라..
Q3. 입력된 수가 홀수인지 확인
while
사용- 0은 짝수로 간주
- 나눗셈, 몫 연산자 사용 금지
function isOdd(num){
if(num < 0){
num = -num;
}
while(num >= 0){
num = num - 2;
if(num === 1){
return true;
}
} return false;
}
//위 while문은 아래처럼 바꿀 수 있다
while(num>=0){ //(while구문) 0 보다 클때 , (조건문) num 1일 때는 ture 리턴, 0일때는 false 리턴하기
if(num === 1){
return true;
} else if(num === 0){
return false;
}
num = num - 2; //-2씩 빼서 0인지 아닌지 확인 해보기!
}
Check 👉🏾 특정 연산자를 사용 못하면 제일 무식한 방법이 컴퓨터가 처리하는 과정이다! (홀수 찾기 = 계속 2씩 빼서 나머지 확인하기)
Q7. 1부터
num
까지 정수로 구성된 문자열
while
사용- 숫자 사이
'-'
로 구분
function makeDigits2(num){
let string = '1';
let i = 2;
while(i<=num){
string += `-${String(i)}`;
i++;
}
return string;
}
Check 👉🏾 표현식 포함한 문자열 ${}
에 익숙해지자!
Q10. 두 수를 입력받아 두 수를 포함해 그 사이의 수 중 2의 배수의 개수를 리턴하라
for
문 사용num
과num2
대소관계는 모름- 0은 2의 배수가 아니라고 가정
function makeMultiplesOfDigit2(num1, num2){
let count = 0;
let start = Math.min(num1, num2);
let end = Math.max(num1, num2);
// 반환할 개수 변수, 시작값, 끝값을 선언한다
// num1과 num2 대소 비교해 시작값과 끝값에 할당한다
for(i=start; i<=end; i++){ // 2의 배수를 찾는 for문을 만든다
if(i % 2 === 0 && i !== 0){ // 0을 제외하는 구문을 &&로 추가한다
count++
}
}return count;
}
Check 👉🏾 사용할 수 있는 Method가 있으면 적극 활용하자
Check 👉🏾 예외가 있다면 아예 따로 if문을 만들기보단 !을 이용, 추가하여 예외처리 해주자
[주말에다시]Q18. 1 이상의 자연수를 입력받아 2부터 해당 수까지의 소수들을 리턴하라
num
>= 2string
타입, 2-3-5-7 형식으로 리턴
function listPrimes(num){
let result = '2'; // 일단 2는 무조건 소수이니 시작값으로 넣고 시작
for(let i=3; i<=num; i++){ // 3부터 하나씩 소수인지 확인한다
for(j=2; j<i; j++){ // 그 방법은 i를 2부터 i-1까지의 값으로 나누어보는 것이다
isPrime = true; // 우선 소수인지 나타내는 변수를 지정하고 true를 할당한다
if(i%j === 0){ // 만약 어떤 값으로 나눈 값이 0이라면
isPrime = false; // 할당했던 true는 false가 되고
break; // 더 볼것도 없이 break로 while문을 끝내면 된다
}
}
if(isPrime){ // break로 안빠지고 쭉 isPrime이 true로 남는다면
result += `-${i}`; // result에 '-추가될소수'를 string으로 추가한다
}
}
return result;
}
Check 👉🏾 for문을 더 간략화해보자.
1. i 증감을 +1이 아닌 +2로 할 수 있다.
: 짝수는 이미 2를 약수로 가지니 시작값 3부터 홀수만 보면 된다.
2. j는 i의 제곱근 범위까지만 확인하면 된다.
1*자신
/ 2nd작은수*2nd큰수
/ 3rd작은수*3rd큰수
...
를 약수로 가진다.nth 작은수
만 확인되면 어차피 소수가 아닌 것이다.1*자신
/ 2nd작은수*2nd큰수
/ 3rd작은수*3rd큰수
...
에서 중간은 제곱근*제곱근
이므로, 절반 지점인 제곱근까지만 보면 된다!따라서, 아래와 같이 반복문을 간략화 할 수 있다.
for(let i=3; i<num; i+=2){
for(let j=2; j<=Math.sqrt(i); j++){
if(i%j ===0){
isPrime = false;
break;
}
}
}
Q19. 문자열에 등장하는 각 문자로 길이 2의 문자열들을 나열해 리턴하라.
- 입력받은 문자열이
abc
라면,aa,ab,ac,ba,bb,bc,ca,cb,cc
function makePermutations(str){
let result = ''; // 반환할 결과값 변수 선언
for(let i=0; i<str.length; i++){ // result = left + right라고 생각하고 이중 for문 구성
for(let j=0; j<str.length; j++){
result = result + `,${str[i]}${str[j]}`; // 앞에 콤마를 더해 계속 붙여준다
}
}
return result.substring[1]; // 마지막 반환 때 맨 처음 콤마만 삭제한다
}
Check 👉🏾 반복되는 규칙에서 예외가 있을 때 (이 문제에서는 맨 첫 콤마) 맨 처음에 빼줄 수 있는지 마지막에 없애야하는지 생각해보고 방도를 찾는다.
Q20. 문자열에 속에 중복되는 문자가 있는지 확인하라.
- 중복 문자열이 있는 경우
true
반환- 빈 문자열을 입력받는 경우
false
반환
function hasRepeatedCharacter(str){
for(let i=0; i<str.length; i++){
for(let j=i+1; j<str.length; j++){
if(str[i] === str[j] && str.length !== 0){
return true;
}
}
}return false;
}
Check 👉🏾 중간 조건문에 return true;
가 있는 이런 문제.. return false;
는 어디로 빼야할지 항상 고민된다.
[주말에다시]Q21. 문자열에 속 문자를 한 글자씩 다시 작성하는데 부분적으로 완성된 문자열을 전부 이어붙여 리턴하라.
abc
를 입력받았을 때aababc
반환- 빈 문자열을 입력받은 경우 빈 문자열을 리턴
function makeMarginalString(str){
let result ='';
for(let i=0; i<str.length; i++){ // 기준으로 할 문자열 선택
for(let j=0; j<=i; j++){ // 기준 문자열보다 앞에 있는 것을 계속 쭉 적어준다
result += str[j];
}
}return result;
}
Check 👉🏾 나는 a, ab, abc를 만들어 이어주는 두 단계로 생각했었는데 완전 잘못생각한거였다..