[코플릿] 조건문과 반복문

KIM DA MI·2023년 2월 22일
1

코플릿

목록 보기
1/1
post-thumbnail

오늘은 코플릿 활동으로 페어분들과 함께
조건문과 반복문 문제들을 풀어보는 시간을 가졌다.

지난번 진행했었던 변수와 타입 문제에서는 이렇게까지 막히진 않았는데
점점 난이도가 상승함을 느꼈다. 😂😂

풀었던 문제들 중에서
헷갈릴 수 있는 문제들을 다시 정리해보는 시간을 가져본다.


조건문


7. addOneSecond


문제

시, 분, 초를 입력받아 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. 템플릿 리터럴 내부에 결과를 삽입한다.

}



8. findShortestOfThreeWords


문제

차례대로 문자열 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을 리턴한다.
    }
}



반복문


7. replaceAll


문제

문자열과 두 개의 문자(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;						// 반복문이 모두 종료되면 결과를 리턴한다.
}


9. isPrime


문제

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;		// 반복문이 모두 종료되면 결과를 리턴한다.
}


10. listPrimes


문제

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;		// 이중 반복문이 모두 종료되면 결과를 리턴한다.
}


12. hasRepeatedCharacter


문제

문자열을 입력받아 해당 문자열에 중복된 문자(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;		// 이중 반복문이 모두 종료되면 결과를 리턴한다.
}

0개의 댓글