[프로그래머스/코딩테스트 모음/Javascript] 11

TED·2023년 8월 22일
0

Javascript CodingTest

목록 보기
11/63
post-thumbnail
  • 오늘도 달려보자 마라톤,,, ㅠㅠ

<오늘의 문제>

🌟 = 내가 생각한 난이도있는 풀이
1. 최소직사각형 1레벨
2. 크기가 작은 부분 문자열 1레벨
3. 이상한 문자만들기 1레벨

1. 🌟최소직사각형🌟

function solution(sizes) {
    let maxWidth = 0
    let maxHeight = 0;

    sizes.forEach((size) => {
        size.sort((a, b) => a - b); // 오름차순을 해줘야 무조건 [0]에는 작은값이 [1]에는 큰값이 들어간다.
        
        let [width, height] = size; // 배열 구조분해할당을 해서 (배열을 해체)
                                    // size[0]->width size[1]->height 값을 집어넣고
        if (maxWidth < width) maxWidth = width;
        if (maxHeight < height) maxHeight = height;
    })
    
    return maxWidth * maxHeight;
}
  • 나의 풀이
    : 배열 요소들은 앞뒤를 바꿔서 가로 세로를 바꿀수 있다. 그래서 가로값이나 세로값은 값을 뒤집었을때
    모든(가로나 세로) 값을 수용할수있는 최대값을 찾아야한다. 간단하게 말하면 가로값의 최대값 세로값의 최대값을 찾는것..
    일단, 가장 큰값을 넣을 초기값을 세팅해주고, forEach()를 통해 반복을해준다 그리고 각 배열요소들을 오름차순해줬는데,
    내림차순을 해도 상관없다. 더 빠를지도..?? 구조분해할당으로 배열에 값을 할당해주고, 최대값 구하는 if문으로 해결..
function solution(sizes) {
    let w = 0;
    let h = 0;
    sizes.forEach(s => {
        const [a, b] = s.sort((a,b) => a-b);
        if (a > h) h = a;
        if (b > w) w = b;
    });

    return w * h;
}
  • 나와 비슷한 다른 사람 풀이
    : 거의 똑같다고 봐야하는데, 아예 변수할당을 자체에 차순을 멕여버리고 바로 진행할 수 있구나...
function solution(sizes) {
    const rotated = sizes.map(([w, h]) => w < h ? [h, w] : [w, h]);

    let maxSize = [0, 0];
    rotated.forEach(([w, h]) => {
        if (w > maxSize[0]) maxSize[0] = w;
        if (h > maxSize[1]) maxSize[1] = h;
    })
    return maxSize[0]*maxSize[1];
}
  • 다른 사람 풀이
    : 코멘트 중 가장 가독성이 좋다는 말이 많아서 참조하게된 코드인데, map의 활용은 봐도봐도 내입장에선 무궁무진한 느낌이라
    볼때 마다 새로워서 익히기가 어렵다 ㅠㅠ... 도데체 어케 저렇게 쓴거지..?? 응???? 아예 차순을 먼저 먹이고, forEach로 반복을 돌리는건데,, 하 어렵다 ㅠㅠ....

2. 🌟크기가 작은 부분 문자열🌟

function solution(t, p) {
    var answer = 0;					// t가 "10203" n이 "15" 인 예시
    
    for(let i = 0; i <= t.length - p.length; i++){ // i <= 3
        let Num = t.substr(i, p.length); // [0],[1],[2],[3] 길이는 2
        if (Number(Num) <= Number(p))    // 10, 2, 20, 3, 
            answer ++;
    }
    
    return answer;
}

// [0],[1],[2],[3],[4]
// 314,141,415,159,592
  • 나의 풀이
    : 문자열 t의 요소를 문자열 n의 길이 만큼만 뽑아낸값들 중에 n의 숫자형값보다 작은값을 출력하는 문제였는데,, 골머리 터질뻔했다.
    일단 새로운 메서드를 사용해야될거 같다는 직감이와서 문자열에서 뽑아내줄 메서드를 검새하던 중 substr(start,length)를 찾게됬다. 문자들의 추출을 시작하는값, 즉 i가 0부터 시작이니, 인덱스[0]값부터, p.length 길이만큼만 출력되는 것이고,
    자세한 예시는 주석으로 달아뒀다. 기본적으로 문자열이기때문에 값을 비교하기 위해 Number() 를 사용했다.

3. 🌟🌟🌟🌟🌟이상한 문자만들기🌟🌟🌟🌟🌟

function solution(s) {
    let answer = "";
    let arr = s.split(" "); // 공백이아닌 space를 기준으로 분리한다..
                            // 그럼 이렇게 분리된다 "try", "hello", "world"
    for(let i=0; i<arr.length; i++){ // i < 2
        // j는 문자에 영향을 직접 주는게아니고, 문자의 위치값을 알아내기 위해 쓴 변수선언이다..
        for(let j=0; j<arr[i].length; j++){ // i=0 -> try니까 인덱스 0,1,2 3개에 대한 j값이 반복을돌고
            if(j % 2 === 0){                // 짝수번째 글씨에 대문자 홀수번째 글씨에 소문자로 변경
                answer = answer + arr[i][j].toUpperCase();
            }else{ // arr[0][0] => t. arr의 인덱스0번째 행의 인덱스0번째 값이라는 의미.
                answer = answer + arr[i][j].toLowerCase();
            }
        } // 이대로 그냥 출력시에는 "TrYHeLlOWoRlD" 
        if(i < arr.length - 1){ // 각 단어 "try", "hello", "world" 가 끝나면 공백을붙여서
                                // "TrY HeLlO WoRlD" 이렇게 만들어줄건데 맨뒤에는 공백이 붙으면안되니까
                                // arr.length-1을 해서 "world"뒤에는 공백을 안붙여지게 만들었다.
                answer = answer + " ";
            }
    }
    
    return answer;
}
  • 나의 풀이
    : 진짜 진짜 진짜 머리 터질뻔했다 내 머리를 그냥 터뜨려버리고 싶었 다 ㅋㅎㅋㅎ ...
    일단 문제속에서 공백을 기준으로 분리했길래 똑같이 s.split(" ")으로 분리해서 나눴고,
    그렇게 각 문자를 인덱스별로 for문으로 돌린뒤 다음 for문으로 각각의 열의(문자의)위치에 맞춰서 j값이 짝수이면 대문자, 홀수이면 소문자로 바뀌게 돌렸다.
    그리고 자꾸단어가 붙어서 나오는데 이걸 어떻게 공백을 넣어야되나 골머리가 썪어버리는줄 알았다...
    왜들 쉽게 푸는거같지?? 내 머리 어떻해??????
    그래서 마지막 단어를 제외하고 i값을 넣어서 0과 1의 인덱스값에 공백을 붙여주고 마무리..
    아 오늘 이제 안풀래 gg... ...
profile
컴맹 개발 입문자

0개의 댓글