문제 -반복문-

hyo·2021년 11월 11일
0

반복문 코플릿

3번

수를 입력받아 홀수인지 여부를 리턴하라!

인자 : num은 number타입의 정수 (0보다 작은 -일수도있음)
단, while문을 사용해라(for문 사용금지)
나눗셈(/), 나머지(%) 연산자 사용 금지
0은 짝수로 간주

여부를 리턴하라함은 boolean타입을 리턴 하라는 말이다.
코드를 써보자.

우선 num이 음수일때, 홀수여부를 판단할 수 없으므로 num = -num을 써준다.
홀수인지 판단하는법은 나눗셈, 나머지, 2씩 빼줘서 마지막 숫자가 1이 나오는지 확인해보면 알수있다.


5번

문자열과 수를 입력받아 반복된 문자열을 리턴하라.

인자: str은 string타입의 문자열
인자: num은 number타입의 정수(num >= 0)
주의사항
반복문 for문을 사용하라
0을 입력받으면 빈문자열 리턴!

반복문을 쓰지않아도 된다면, 함수안에 return str.repeat(num); 이라는 repeat() 매서드를 사용할 수 있지만, 문제는 for문을 사용하라 했으므로 사용해서 써본다.


변수하나를 선언해주고 반복문을 통해 i변수는 선언하되 사용하진않고 i 횟수만큼 반복문안의 본문을 반복시켜준다.
result += str; 을 i번 반복!


7번

수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열을 리턴하라!

인자: num은 number타입의 정수(num >= 1)
string타입을 리턴하라
while문을 사용하라
숫자 사이를 '-'로 구분한다.
ex) '1-2-3-4-5-6'

result 라는 변수에 '1'을 넣어주고, 변수 i를 2로 선언해준다.
while(i <= num) i를 2부터 num까지 반복시켜주는것이다.

result = result + '-' + String(i); i++;

로 마무리!


8번

수(num)를 입력받아 1을 포함하여 num개의 홀수로 구성된 문자열을 리턴하라.

인자 : num은 number타입의 정수 (num >= 1)
string타입을 리턴하라.
반복문(while)문을 사용하라.
숫자(number string) 사이의 구분은 없다.
ex)'13579'

num횟수만큼! 1부터 홀수인녀석들로만! 이루어진 문자열을 리턴하는것이므로
우선 변수 3개를 선언하였다.
홀수로 넣어서 1부터 시작이므로 2씩 더해줄것이다.
-> let i = 1; , i+=2;
num횟수만큼!
->let count = 0 , while(count < num), count++;


10번

두 개의 수를 입력받아 두 수를 포함해 두 수 사이의 수 중 2의 배수의 개수를 리턴하라.

인자 : num1,num2는 number타입의 정수(num1,num2 >= 0)
number타입 리턴!
for문 사용하라
num1이 num2보다 작지 않을 수도 있다.
0은 2의 배수가 아니라고 가정한다.

num1이 num2보다 작지 않을 수도 있다고 했으므로,
start,end라는 변수를 선언해주고 num1,num2를 할당해준다
그리고 조건문을 사용하여 num1 > num2 일때
-> start = num2, end = num1 을 할당시킨다는 조건을 걸어준다.

그리고 2의배수의 개수를 리턴하라했으므로
count변수 하나를 선언해주고 반복문을 시작해준다.
for(let i = start; i <= end; i++) 써주고,
0은 2의 배수가 아니라고 가정했으므로
if(i !== 0 && i % 2 === 0) 조건에 맞을때 count++ 로 개수를 세어준다.


18번 (난이도 높음)

2 이상의 자연수를 입력받아 2부터

해당 수까지의 소수(Prime number)들을 리턴하라!

인자 : num은 number타입의 정수(num >= 2)
string타입을 리턴!
ex) 2-3-5-7 의 형식으로 리턴
이중 반복문 사용하라

우선 Math.sqrt(num)은 제곱근을 구하는 매서드이다.
num >= 2 이므로 결과값은 무조건 2 부터 시작이므로
let result = '2' 써주고
for(let i = 3; i <= num; i+=2) -> 들어갈 소수(prime)들을 반복시킬것이다.

2는 할당해뒀으므로 그이후의 소수는 3부터 초기값을 정해두고,
num까지!, 짝수는 소수가 절대 될 수 없으므로 i+=2로 홀수들만 골라서 빼둔다.

그리고 이제 그 골라둔 홀수들이 소수인지 여부를 확인하려면
홀수는 짝수로는 절대 나누어지지 않으므로 똑같이
for(let j = 3; j < sqrt; j+=2)로 써준다.
여기서 쓰기전에 let sqrt = Math.sqrt(i)는 제곱근은 구하는 매서드로써 왜 썻냐하면, 어차피 주어진 숫자를 그 숫자의제곱근 위의 숫자로 나누면 1미만이므로 컴퓨터의 불필요한 계산을 없애고자 써주었다.
그리고 let isPrime = true; 변수선언과 할당을 한 이유는
만약에 이중반복문 안에 if(i % j !== 0)이렇게 써주고 i를 빼온다면,j가 다 반복되지않았는데도 나누어서 나머지가 0이 아닐경우 바로 i 가 조건 성립이 되어 밖으로 나와버리기때문에,
if(i % j === 0){isPrime = false; break;}
를 써주면 나누어 떨어지기만해도 break가 걸려 다음 반복문을 진행시켜버린다(두번째반복문 이전의 상위에있는 반복문으로 돌아가서 다시 그다음 홀수 i로 진행)
그렇게 이중반복문안의 조건이 성립되지않으면 isPrime = true와 그안에 있는 i가 같이 그다음 문장인 if(isPrime){result = result + '-' +String(i);}
로 들어가게 되므로 소수들만 나열돼서 나오는 것이다.

19번

문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴하라!

인자 : str은 string타입의 문자열
string타입을 리턴하라!
입력받은 문자열의 각 문자를 0,1,2...,n 이라고 할 경우,
00,01,02,...,nn 형식으로 리턴
ex) 'ab' -> 'aa,ab,ba,bb'
'123' ->'11,12,13,21,22,23,31,32,33'

길이 2의 문자열이므로, 0번째,1번째 들어갈 문자열을 정해두고 선언한다. -> let first, let second;

21번

문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴하라!

인자 : str은 string 타입의 문자열
boolean타입을 리턴 하라!
빈문자열을 입력받는 경우-> false를 리턴
이중반복문 사용하라

우선 빈문자열을 입력받은 경우 -> false리턴을 시켜준다
-> if(str.length === 0){return false;}

우선 str의 인덱스번호 두개로 서로서로 비교하며 같은게 있는지 없는지 알아야하므로

for(let i = 0; i < str.length; i++){
for(let j = i + 1; j < str.length; j++){
if(str[i] === str[j]){
return true;
}
}
}
return false;
}

와 같이 써준다.

profile
개발 재밌다

0개의 댓글