상세 컨텐츠

본문 제목

프로그래머 도전기 31일차

프로그래머가 될거야!

by Choyee 2023. 9. 29. 00:00

본문

오늘은

오늘은 연휴의 시작입니다

내일이면 추석입니다

연휴동안 코딩테스트 문제도 많이 풀고

JavaScript 공부도 좀 하고

Java 복습도 조금씩 해볼 예정입니다

휴일이 긴 만큼 혼자만의 공부시간을 늘려서 

기초를 잘 닦아놓도록 해야겠습니다

 

코딩 테스트
Description
아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 양의 정수 배열 arr가 매개변수로 주어질 때, arr의 앞에서부터 차례대로 원소를 보면서 원소가 a라면 X의 맨 뒤에 a를 a번 추가하는 일을 반복한 뒤의 배열 X를 return 하는 solution 함수를 작성해 주세요.
function solution(arr) {
    var answer = [];
    // 배열X
    // 원소가 a라면 a번 반복
    for(var i = 0; i < arr.length; i++){
        for(var j = 0; j < arr[i]; j++){
            answer.push(arr[i]);
        }
    }
    return answer;
}

두번째 반복문 변수 j 의 범위를 arr[i]로 해주어 원소의 값만큼만 반복하도록 해주고

나온 값들을 push() 함수를 이용하여 합쳐주었습니다

 

Description
이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.
두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다. 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다. 두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.
function solution(arr1, arr2) {
    var sub1 = 0;
    var sub2 = 0;
    // 배열의 길이가 긴 쪽이 더 큼
    //arr1.length > arr2.length ? (arr1 > arr2) : (arr2 > arr1)
    // 배열의 길이가 같다면  모든 원소의 합을 비교 -> 더큰 쪽이 큼. 같다면 같음
    //arr1.length == arr2.length 
    for (var i = 0; i < arr1.length; i++){
        sub1 += arr1[i];
    }
    for( var i = 0; i < arr2.length; i++){
        sub2 += arr2[i];
    }
    
    // arr2가 크다면 -1, ar11이 크다면 1, 같다면 0 
    
    if(arr1.length > arr2.length){
        return 1;
    }
    if(arr1.length < arr2.length){
        return -1;
    }
    if(arr1.length == arr2.length){
        if(sub1 > sub2){
            return 1;
        }
        if(sub1 < sub2){
           return -1;
        }
        return 0;
    }
}

저에겐 난이도가 꽤 있던 문제였습니다. 이렇게 저렇게 머리를 굴려보았지만 역시 for문 반복과 if문 조건식을

활용하여 처리하는 것이 익숙해서 주어진 조건의 합을 각각 선언하여 값을 반환시켰습니다

 

Description
알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.
단, 알파벳 대문자와 소문자는 구분하지 않습니다.
function solution(myString, pat) {
    
    myString = myString.toLowerCase();
    pat = pat.toLowerCase();
    
    return myString.includes(pat) ? 1 : 0;
}

toLowerCase() 함수로 소문자로 통일시켜주고

삼항 연산자로 값을 받도록 하였습니다

 

Description
어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.
function solution(n, t) {
    var answer = 0;
    
    // 어떤 세균 -> 1시간에 * 2씩 증식
    // 처음 세균의 마리수 = n
    // 경과한 시간 = t 
    // t시간 후의 세균 마리수
    for(var i = 1; i <= t; i++){
       n *= 2;
    }
    return n;
}

문제를 풀 때는 문제를 분석하는 능력이 정말 중요한 것 같습니다

코드를 풀어나가는 것 자체도 문제를 어떻게 해석하냐에 따라서 많이 달라지는 것 같습니다

 

Description
정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
function solution(num_list) {
    var answer = [];
    // 오름차순으로 정렬
    // 0~4번 인덱스 잘라내기
    // 5번째 인덱스부터 추출
    // 나머지 수로 반환
    num_list.sort(function (a, b) {
        return a - b;
    });
    return num_list.slice(5);
}

sort() 함수를 그냥 사용하면 숫자의 앞자리 값만을 보고 비교를 하기때문에 10보다 2가 큰 값으로 나와서

1 10 2 의 순서가 되어버립니다

그래서 function함수를 이용해 a - b가 음수인지 아닌지 판단을 해서 수의 대소를 비교하게 하였습니다

이후 오름차순으로 정렬된 배열을 slice() 함수를 이용해 5번째 인덱스부터 값을 반환할 수 있도록 하였습니다

 

Description
1부터 6까지 숫자가 적힌 주사위가 두 개 있습니다. 두 주사위를 굴렸을 때 나온 숫자를 각각 a, b라고 했을 때 얻는 점수는 다음과 같습니다.
a와 b가 모두 홀수라면 a2 + b2 점을 얻습니다.
a와 b 중 하나만 홀수라면 2 × (a + b) 점을 얻습니다.
a와 b 모두 홀수가 아니라면 |a - b| 점을 얻습니다.
두 정수 a와 b가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
function solution(a, b) {
    
    if((a+b) % 2 != 0){
        return 2*(a+b)
    }
    if(a % 2 != 0){
        return a*a + b*b;
    }
        return Math.abs(a-b);
}

굉장히 수학적인 문제라고 느꼈습니다

 

Description
문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.
function solution(myString, pat) {
    var reString = [];
    
    for(var i = 0; i < myString.length; i++){
        if(myString[i] == "A"){
            reString += 'B';
        }
        if(myString[i] == "B"){
            reString += 'A';
        }
    }
    return reString.includes(pat) ? 1 : 0
}

 

 

 

 

2023. 09. 28 (목)

관련글 더보기