반응형

문자열안에 문자열

 

문제 설명

문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ str1의 길이 ≤ 100
  • 1 ≤ str2의 길이 ≤ 100
  • 문자열은 알파벳 대문자, 소문자, 숫자로 구성되어 있습니다.

입출력 예str1str2result
"ab6CDE443fgh22iJKlmn1o" "6CD" 1
"ppprrrogrammers" "pppp" 2
"AbcAbcA" "AAA" 2

입출력 예 설명

입출력 예 #1

  • "ab6CDE443fgh22iJKlmn1o" str1에 str2가 존재하므로 1을 return합니다.

입출력 예 #2

  • "ppprrrogrammers" str1에 str2가 없으므로 2를 return합니다.

입출력 예 #3

  • "AbcAbcA" str1에 str2가 없으므로 2를 return합니다.

 

 

function solution(str1, str2) {
    var answer = 0;

    if (str1.indexOf(str2) > -1) return 1;
    else return 2;
}

console.log(solution("ab6CDE443fgh22iJKlmn1o", "6CD")); // 1
console.log(solution("ppprrrogrammers", "pppp")); // 2
console.log(solution("AbcAbcA", "AAA")); // 2
  • indexOf() 메서드 : 주어진 값과 일치하는 첫 번째 인덱스를 반환합니다. 없으면 -1을 반환합니다.

indexOf() 메서드로 str1변수 내부에 str2변수가 있는지 체크합니다.

있으면 0이상이 나올테고, 없으면 -1이 나올 것이기 때문에 0이상이면 1을 -1이면 2를 리턴해줍니다.

반응형
반응형

제곱수 판별하기

 

문제 설명

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 1,000,000

입출력 예nresult
144 1
976 2

입출력 예 설명

입출력 예 #1

  • 144는 12의 제곱이므로 제곱수입니다. 따라서 1을 return합니다.

입출력 예 #2

  • 976은 제곱수가 아닙니다. 따라서 2를 return합니다.

 

function solution(n) {
    var answer = 0;

    for (let i = 1; i < n; i++) {
        if (i * i === n) return answer = 1;
    }
    return answer = 2;
}

console.log(solution(144)); // 1
console.log(solution(976)); // 2

 

or

 

function solution(n) {
  var answer = 0;

  if (Number.isInteger(Math.sqrt(n))) return 1;
  else return 2;

}

console.log(solution(144)); // 1
console.log(solution(976)); // 2
  • Math.sqrt() 메서드 : 제곱근을 반환해줍니다.
  • Number.isInteger() 메서드 : 주어진 값이 정수인지 판별해줍니다.

Math.sqrt() 메서드로 숫자를 반환해준다음 Number.isInteger() 메서드로 반환된 값이 정수인지 판별해줍니다 !

 

반응형
반응형

세균 증식

 

문제 설명

어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 10
  • 1 ≤ t ≤ 15

입출력 예ntresult
2 10 2048
7 15 229,376

입출력 예 설명

입출력 예 #1

  • 처음엔 2마리, 1시간 후엔 4마리, 2시간 후엔 8마리, ..., 10시간 후엔 2048마리가 됩니다. 따라서 2048을 return합니다.

입출력 예 #2

  • 처음엔 7마리, 1시간 후엔 14마리, 2시간 후엔 28마리, ..., 15시간 후엔 229376마리가 됩니다. 따라서 229,376을 return합니다.

 

function solution(n, t) {
    var answer = 0;

    for (let i = 1; i < t + 1; i++) {
        n = n * 2
    }
    answer = n;

    return answer;
}

console.log(solution(2, 10)); // 2048
console.log(solution(7, 15)); // 229376

시간마다 n에 2씩 곱해줍니다

반응형
반응형

문자열 정렬하기 (2)

 

문제 설명

영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때, my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 0 < my_string 길이 < 100

입출력 예my_stringresult
"Bcad" "abcd"
"heLLo" "ehllo"
"Python" "hnopty"

입출력 예 설명

입출력 예 #1

  • "Bcad"를 모두 소문자로 바꾸면 "bcad"이고 이를 알파벳 순으로 정렬하면 "abcd"입니다.

입출력 예 #2

  • "heLLo"를 모두 소문자로 바꾸면 "hello"이고 이를 알파벳 순으로 정렬하면 "ehllo"입니다.

입출력 예 #3

  • "Python"를 모두 소문자로 바꾸면 "python"이고 이를 알파벳 순으로 정렬하면 "hnopty"입니다.

 

function solution(my_string) {
    var answer = '';
    answer = my_string.toLowerCase().split("").sort().join("");

    return answer;
}

console.log(solution("Bcad")); // abcd
console.log(solution("heLLo")); // ehllo
console.log(solution("Python")); // hnopty

split() 메서드로 조각조각 내준 다음 sort() 메서드로 정렬을 시켜 주고 join() 메서드로 다시 이어 붙여줍니다.

반응형
반응형

7의 개수

문제 설명

머쓱이는 행운의 숫자 7을 가장 좋아합니다. 정수 배열 array가 매개변수로 주어질 때, 7이 총 몇 개 있는지 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 1 ≤ array의 길이 ≤ 100
  • 0 ≤ array의 원소 ≤ 100,000

입출력 예arrayresult
[7, 77, 17] 4
[10, 29] 0

입출력 예 설명

입출력 예 #1

  • [7, 77, 17]에는 7이 4개 있으므로 4를 return 합니다.

입출력 예 #2

  • [10, 29]에는 7이 없으므로 0을 return 합니다.

 

function solution(array) {
    var answer = 0;
    let a = JSON.stringify(array);
    // let a = array.toString();

    for (let i = 0; i < a.length; i++) {
        if (a[i] === "7") answer++;
    }

    return answer;
}

console.log(solution([7, 77, 17])) // 4
console.log(solution([10, 29])) // 0

먼저 배열을 string으로 만들어 줍니다. string으로 만들어준 array를 for문으로 돌려서 7이 나오는만큼 answer에 숫자를 더해줍니다.

반응형
반응형

잘라서 배열로 저장하기

문제 설명

문자열 my_str과 n이 매개변수로 주어질 때, my_str을 길이 n씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ my_str의 길이 ≤ 100
  • 1 ≤ n  my_str의 길이
  • my_str은 알파벳 소문자, 대문자, 숫자로 이루어져 있습니다.

입출력 예my_strnresult
"abc1Addfggg4556b" 6 ["abc1Ad", "dfggg4", "556b"]
"abcdef123" 3 ["abc", "def", "123"]

입출력 예 설명

입출력 예 #1

  • "abc1Addfggg4556b" 를 길이 6씩 잘라 배열에 저장한 ["abc1Ad", "dfggg4", "556b"]를 return해야 합니다.

입출력 예 #2

  • "abcdef123" 를 길이 3씩 잘라 배열에 저장한 ["abc", "def", "123"]를 return해야 합니다.

유의사항
  • 입출력 예 #1의 경우 "abc1Addfggg4556b"를 길이 6씩 자르면 "abc1Ad", "dfggg4" 두개와 마지막 "556b"가 남습니다. 이런 경우 남은 문자열을 그대로 배열에 저장합니다.

 

1번방법

function solution(my_str, n) {
    var answer = [];
    let arr = my_str.split("");

    let count = n;
    for (let i = 0; i < arr.length; i += n) {

        answer.push(arr.slice(i, count).join(""));

        count = count + count;
    }
    return answer;
}

console.log(solution("abc1Addfggg4556b", 6)); // ['abc1Ad', 'dfggg4', '556b']
console.log(solution("abcdef123", 3)); // ['abc', 'def', '123']

37.5%...

 

2번 방법

function solution(my_str, n) {
    var answer = [];

    for (let i = 0; i < my_str.length; i += n) {
        answer.push(my_str.substr(i, n));
    }
    return answer;
}

console.log(solution("abc1Addfggg4556b", 6)); // ['abc1Ad', 'dfggg4', '556b']
console.log(solution("abcdef123", 3)); // ['abc', 'def', '123']

62.5%...

substr() 메서드로 i번째부터 n번째까지 넣어주는 방법

4번으로 성공한 이후에 2번과 같은 방법으로 푼 사람이 있길래 다시 해보니까 성공했습니다.. 뭐지 ?...

 

3번 방법

function solution(my_str, n) {
    var answer = [];
    let arr = my_str.split("");

    for (let i = 0; i < arr.length; i++) {
        answer.push(arr.splice(0, n).join(""))
    }
    return answer;
}

console.log(solution("abc1Addfggg4556b", 6)); // ['abc1Ad', 'dfggg4', '556b']
console.log(solution("abcdef123", 3)); // ['abc', 'def', '123']

62.5%...뭐지..

splice() 메서드로 arr를 잘라내서 for문 돌리기입니다.

 

4번 방법

function solution(my_str, n) {
    var answer = [];
    let arr = my_str.split("");

    while(arr.length > 0) {
      console.log(arr.length);
        answer.push(arr.splice(0, n).join(""));
    }
    return answer;
}

console.log(solution("abc1Addfggg4556b", 6)); // ['abc1Ad', 'dfggg4', '556b']
console.log(solution("abcdef123", 3)); // ['abc', 'def', '123']

while문으로 돌리니까 성공했습니다. 이유가 뭔지..더 빨라서 그런가..

 

5번 방법

function solution(my_str, n) {
    var answer = [];
    let arr = my_str.split("");

    for(const ele of arr) {
      answer.push(arr.splice(0, n).join(""));
    }
    return answer;
}

console.log(solution("abc1Addfggg4556b", 6)); // ['abc1Ad', 'dfggg4', '556b']
console.log(solution("abcdef123", 3)); // ['abc', 'def', '123']

for...of로도 돌려봤지만 실패가 뜹니다..

반응형
반응형

filter() 메서드

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

 

구문

arr.filter(callback(element[, index[, array]])[, thisArg]);

 

매개변수

  • callback: 각 요소를 시험할 함수입니다. true를 반환하면 요소를 유지하고, false를 반환하면 버립니다.
  • element: 처리할 현재 요소
  • index: 처리할 현재 요소의 인덱스
  • array: filter를 호출한 배열
  • thisArg: callback을 실행할 때 this로 사용하는 값

 

반환 값

테스트를 통과한 요소로 이루어진 새로운 배열을 반환합니다. 어떤 요소도 테스트를 통과하지 못하면 빈 배열을 반환합니다.

 

예제

 

작은 값 걸러내기 [ 10 이하인 모든 요소가 제거된 새로운 배열을 만들어줍니다. ]

function isBig(value) {
    return value >= 10;
}

let array = [1, 2, 5, 10, 100, 1000];
let filltered = array.filter(isBig);

console.log(filltered); // [10, 100, 1000]

 

배열 내용 검색 [ 배열 내용을 조건에 따라 검색한 새로운 배열을 만들어줍니다. ]

let array = ["사과", "바나나", "도토리", "포도", "도장", "망고", "오렌지", "사다리"];

function filterItems(query) {
    return array.filter(function(el) {
        return el.toLowerCase().indexOf(query.toLowerCase()) > -1;
    });
}

console.log(filterItems("사")); // ['사과', '사다리']
console.log(filterItems("도")); // ['도토리', '포도', '도장']

.toLowerCase() 메서드는 대문자를 소문자로 변경시켜줍니다. ( 한글만 사용할때는 사용하지 않아도 됩니다. )

반응형
반응형

제네릭 ( Generic )

제네릭은 C#과 Java와 같은 객체지향 프로그래밍에서 사용하는 기법입니다.

메서드 매개변수의 구체적인 타입을 기재하지 않고 다양한 타입을 처리할 수 있는 기술이며, 잘 사용하면 코드의 재사용성을 높일 수 있습니다.

제네릭은 타입을 엄격하게 관리하는 타입스크립트에서도 사용할 수 있으며, Function, interface, class의 재사용성을 높일 수 있습니다.

 

Generic 기본 문법 적용

function numFunc<T>(arg: T): T {
    console.log(arg);
    return arg;
}
function numFunc2<T>(arg: T) {
    console.log(arg)
}

numFunc<string>("HELLO");
numFunc2<number>(12345);

T는 Type의 약자로 다른 언어에서도 제네릭을 선언할 때 관용적으로 사용됩니다. T는 식별자로 사용할 수 있는 것이라면 무엇이든 들어갈 수 있습니다. _, A 등등도 가능합니다. 하지만 대부분의 경우 T를 사용합니다.

 

function numFunc<string>(arg: string): string {
    console.log(arg);
    return arg;
}
function numFunc2<number>(arg: number) {
    console.log(arg)
}

numFunc<string>("HELLO");
numFunc2<number>(12345);

위 코드처럼 numFunc<string>("HELLO")과 numFunc2<number>(12345)를 호출했을 때 위 코드처럼 정의한 것과 같습니다.

 

 

제네릭을 사용하는 이유

function func(log: string): string {
    return log;
}

func("Hello");

위 코드는 string 인자를 하나 넘겨받아 반환해주는 함수입니다. 여기서 만약에 string 이외에 여러 타입을 허용하고 싶다면 아래처럼 any를 사용할 수 있습니다.

 

function func(log: any): any {
    return log;
}

func("Hello");

타입을 위 코드처럼 바꿔도 함수 동작에 문제가 생기지는 않습니다. 하지만 함수의 인자로 어떤 타입이 들어왔고 어떤 값이 반환되는지 알 수가 없게 됩니다. ( any는 타입 검사를 하지 않기 때문에 보통 javascript를 쓰는것과 같게됩니다. )

이렇게 위 코드의 문제점을 해결할 수 있는 것이 아래의 제네릭입니다.

 

function func<T>(log: T): T {
    return log;
}

func("Hello");

먼저 함수 이름뒤에 <T>를 추가했습니다. 그리고 함수의 인자와 반환 값에 모두 T라는 타입을 추가했습니다. 이렇게 되면 함수를 호출할 때 넘긴 타입에 대해 타입스크립트가 추정할 수 있습니다. 따라서, 함수의 입력값에 대한 타입과 출력 값에 대한 타입이 동일한지 검증할 수 있습니다.

그리고 위처럼 선언한 함수는 아래코드처럼 2가지 방법으로 호출할 수 있습니다.

 

// 1번
const text = func<string>("성공!");

// 2번
const text = func("성공!!");

보통 두 번째 방법이 짧고, 가독성이 좋기 때문에 흔하게 사용됩니다. 하지만 만약 코드에서 두 번째 코드로 타입이 추정되지 않는다면 첫 번째 방법을 사용합니다.

 

typescript 더보기

반응형
반응형

문자열 밀기

 

문제 설명

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 몇 번 밀어야 하는지 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

입출력 예ABresult
"hello" "ohell" 1
"apple" "elppa" -1

입출력 예 설명

입출력 예 #1

  • "hello"를 오른쪽으로 한 칸 밀면 "ohell"가 됩니다.

입출력 예 #2

  • "apple"은 몇 번을 밀어도 "elppa"가 될 수 없습니다.

 

function solution(A, B) {
    var answer = 0;
    let confirm = "";
    let count = 0;
    
    if (A === B) return answer = 0;

    for (let i = 0; i < A.length; i++) {
        count++;
        if (confirm === "") confirm = A;

        let lastString = A.at(-(i + 1));

        let sub = confirm.substring(0, confirm.length - 1);

        confirm = lastString + sub;

        if (confirm === B) return answer = count;
    }
    return answer = -1;
}

처음에 A === B가 같은 상황을 넣지 않았더니 실패했습니다...

 

반응형
반응형

종이 자르기

 

문제 설명

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.

정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 0 < M, N < 100
  • 종이를 겹쳐서 자를 수 없습니다.

입출력 예MNresult
2 2 3
2 5 9
1 1 0

입출력 예 설명

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 가로 2 세로 5인 종이는 가로로 1번 세로로 8번 총 가위질 9번이 필요합니다.

입출력 예 #3

  • 이미 1 * 1 크기이므로 0을 return 합니다.

 

function solution(M, N) {
    var answer = 0;

    answer = M * N - 1;
    console.log(answer);
    return answer;
}

solution(2, 2); // answer = 3
solution(2, 5); // answer = 9
solution(1, 1); // answer = 0

처음에는 문제 내용이 조금 헷갈렸습니다. 맨 아래 그림을 그려보고 이해했습니다. ( 바보인가.. )

이번 문제는 어렵게 생각하지 말고 패턴을 보고 풀어야 하는 문제였습니다. 

2 * 2 - 1 = 3

2 * 5 - 1 = 9

1 * 1 - 1 = 0

2, 5

반응형

+ Recent posts