오늘은 코플릿 활동으로 페어분들과 함께
조건문과 반복문 문제들을 풀어보는 시간을 가졌다.
지난번 진행했었던 변수와 타입 문제에서는 이렇게까지 막히진 않았는데
점점 난이도가 상승함을 느꼈다. 😂😂
풀었던 문제들 중에서
헷갈릴 수 있는 문제들을 다시 정리해보는 시간을 가져본다.
시, 분, 초를 입력받아 1초를 더한 결과값을 특정 형태의 메시지로 리턴해야 합니다.
string 타입을 리턴해야 합니다.
1초 뒤에 {hour}시 {minute}분 {second}초 입니다 형식으로 리턴해야 합니다.
let output = addOneSecond(14, 17, 59);
console.log(output); // --> '1초 뒤에 14시 18분 0초 입니다'
output = addOneSecond(1, 59, 59);
console.log(output); // --> '1초 뒤에 2시 0분 0초 입니다'
output = addOneSecond(3, 24, 29);
console.log(output); // --> '1초 뒤에 3시 24분 30초가 입니다'
output = addOneSecond(23, 59, 59);
console.log(output); // --> '1초 뒤에 0시 0분 0초 입니다'
function addOneSecond(hour, minute, second) {
second += 1 // 1. 1 second(초)가 지나고
if (second === 60) { // 2. second(초)가 60(초)가 된다면?
second = 0; // 3. second(초)를 0(초)으로 바꿔준 뒤,
minute += 1; // 4. minute(분)에 1(분)을 더해준다.
if (minute === 60) { // 5. 그리고 minute(분)이 60(분)가 된다면?
minute = 0; // 6. minute(분)을 0(분)으로 바꿔준 뒤,
hour += 1; // 7. hour(시간)에 1(시간)을 더해준다.
if (hour === 24) { // 8. 그리고 hour(시간)이 24(시간)이 된다면?
hour = 0; // 9. hour(시간)을 0으로 바꿔준다.
}
}
}
return (`1초 뒤에 ${hour}시 ${minute}분 ${second}초 입니다`) // 10. 템플릿 리터럴 내부에 결과를 삽입한다.
}
차례대로 문자열 3개를 입력받아, 가장 짧은 문자열을 리턴해야 합니다.
동일한 길이의 문자열 중에서는 처음 입력받은 문자열을 리턴해야 합니다.
let output = findShortestOfThreeWords('a', 'two', 'three');
console.log(output); // --> 'a'
output = findShortestOfThreeWords('c', 'b', 'a');
console.log(output); // --> 'c'
function findShortestOfThreeWords(word1, word2, word3) { if (word1.length <= word2.length) { // 1. word1의 길이가 word2의 길이보다 짧거나 같고, if (word1.length <= word3.length) { // 2. word1의 길이가 word3의 길이보다 짧거나 같다면? return word1; // 3. word1을 리턴한다. } else { // 4. 아니라면? return word3; // 5. word3을 리턴한다. } } else if (word2.length <= word3.length) { // 6. 1번이 아닐 떄, word2의 길이가 word3의 길이보다 짧거나 같으면, return word2; // 7. word2을 리턴한다. } else { // 8. 6번도 아니라면? return word3; // 9. word3을 리턴한다. } }
문자열과 두 개의 문자(from, to)를 입력받아,
문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴해야 합니다.
string 타입을 리턴해야 합니다.
let output = replaceAll('loop', 'o', 'e');
console.log(output); // --> 'leep'
function replaceAll(str, from, to) {
// 변수 하나 만들어 놓고, 빈 문자열로 시작해서, 만약에 from을 찾으면 from자리에 to를 넣는다.
let result = "";
for (let i=0; i<str.length; i++) { // 문자수만큼 반복한다.
if (str[i] === from) { // str[i]가 입력받은 from과 같으면
result += to; // from 대신 to를 넣는다
} else { // 그렇지 않다면
result += str[i]; // 그냥 차례대로 넣는다
}
}
return result; // 반복문이 모두 종료되면 결과를 리턴한다.
}
1 이상의 자연수를 입력받아 소수(prime number)인지 여부를 리턴해야 합니다.
boolean 타입을 리턴해야 합니다.
let output = isPrime(2);
console.log(output); // --> true
output = isPrime(6);
console.log(output); // --> false
output = isPrime(17);
console.log(output); // --> true
// 소수 : 1과 자기자신으로 밖에 나눠지지 않는 자연수
function isPrime(num) {
if (num === 1) { // 1. 소수는 1보다 커야 한다.
return false;
}
if (num === 2) { // 2. 짝수는 소수가 아니다. (단, 2는 소수다.)
return true;
}
if (num % 2 === 0) {
return false;
}
for (let i = 3; i < num; i+=2) { // 3. 어떤 수를 3부터 자기 자신 전까지의 수로
if (num % i === 0) { // 나눠서 떨어지면
return false; // 소수가 아니다.
}
}
return true; // 반복문이 모두 종료되면 결과를 리턴한다.
}
// 제곱근을 사용하여 풀기 (위의 풀이와 결과는 같으나, 이 방법이 시간 단축 됨)
function isPrime(num) {
if (num === 1) {
return false;
}
if (num === 2) {
return true;
}
if (num % 2 === 0) {
return false;
}
let sqrt = Math.sqrt(num); // 제곱근을 구하는 메소드
for (let i = 3; i < sqrt; i+=2) {
if (num % i === 0) {
return false;
}
}
return true; // 반복문이 모두 종료되면 결과를 리턴한다.
}
2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 합니다.
이중 반복문(double for loop)을 사용해야 합니다.
string 타입을 리턴해야 합니다.
2-3-5-7의 형식으로 리턴해야 합니다.
let output = listPrimes(2);
console.log(output); // --> '2'
output = listPrimes(6);
console.log(output); // --> '2-3-5'
output = listPrimes(18);
console.log(output); // --> '2-3-5-7-11-13-17'
function listPrimes(num) {
let result = '2'; // 2만 짝수고 나머지는 홀수이기 때문에 2부터 넣고 시작하자!
for (let prime=3; prime<=num; prime+=2) { // 어차피 소수는 짝수가 아니므로 2씩 건너뜀
// 소수면 result에 붙이고, 소수가 아니면 안붙여야 하는데 어떻게 판단할까?
let isPrime = true; // 값이 true인 변수를 생성한다.
for (let i=3; i<prime; i+=2) { // 어떤 수를 3부터 자기 자신 전까지의 수로
if (prime % i === 0) { // 나눠서 떨어지면
isPrime = false; // 소수가 아니다.
}
}
if (isPrime === true) { // for문을 통해 나온 변수의 값이 true와 같다면
result = `${result}-${prime}` // 템플릿 리터럴 내부에 결과를 삽입한다.
}
}
return result; // 이중 반복문이 모두 종료되면 결과를 리턴한다.
}
// 제곱근을 사용하여 풀기 (위의 풀이와 결과는 같으나, 이 방법이 시간 단축 됨)
function listPrimes(num) {
let result = '2';
let sqrt = Math.sqrt(num);
for (let prime=3; prime<=num; prime+=2) {
let isPrime = true;
for (let i=3; i<sqrt; i+=2) {
if (prime % i === 0) {
isPrime = false;
}
}
if (isPrime === true) {
result = `${result}-${prime}`
}
}
return result; // 이중 반복문이 모두 종료되면 결과를 리턴한다.
}
문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴해야 합니다.
이중 반복문(double for loop)을 사용해야 합니다.
빈 문자열을 입력받은 경우에는 false을 리턴해야 합니다.
boolean 타입을 리턴해야 합니다.
let output = hasRepeatedCharacter('abcdefg');
console.log(output); // --> false
output = hasRepeatedCharacter('codestates');
console.log(output); // --> true
output = hasRepeatedCharacter('');
console.log(output); // --> false
function hasRepeatedCharacter(str) {
// 첫번째문자, 두번째 문자 비교
// 첫번째문자, 세번째 문자 비교
// ...
// 첫번째문자, 마지막 문자
// 두번째문자, 세번째문자
// ...
// 마지막 전문자, 마지막문자
for(let i = 0; i < str.length - 1; i++) {
// j의 시작점은 항상 i보다 하나 뒤
for (let j = i + 1; j < str.length; j++) {
if( str[i] === str[j]) {
return true;
}
}
}
return false; // 이중 반복문이 모두 종료되면 결과를 리턴한다.
}