본문 바로가기
내일배움 강의/특강

[Node 7기] 알고리즘 강의 - 2일차

by GREEN나무 2024. 11. 8.
728x90

문제 ( 슬렉 node.js_7기 질문방에 댓글 스레드로 제출)

Q1 문자열 내에서 각 문자가 몇 번 등장하는지 세는 프로그램을 작성하세요. 

    예를 들어, 문자열 'spartan'이 주어지면, 결과는 다음과 같아야 합니다: { s: 1, p: 1, a: 2, r: 1, t: 1, n: 1 }"

 

 

풀이

/*Q. 문자열 내에서 각 문자가 몇 번 등장하는지 세는 프로그램을 작성하세요. 
    예를 들어, 문자열 'spartan'이 주어지면, 결과는 다음과 같아야 합니다: { s: 1, p: 1, a: 2, r: 1, t: 1, n: 1 }”*/
/**
 * 1. 알파벳 으로 돌리기
 * 2. 주어진 문자로 돌리기
 * 개수 조합해서 저장( 객체로 만들기)
 */

function countStr(strs) {
    str = str.toUpprCase()
    let alpabets = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z];
    // 객체 만들기
    for (let alpabet of alpabets){
        let anser
        for(let str of strs ){
            let $[alpabet];
            if(alpabet=str){
                $[alpabet] +=1
            }
        } // 객체에 알파벳:카운트로 추가
        
    }
    // 객체 반환
}

console.log(countStr(sparta))

수정 포인트

function countStr(strs) {
    // 1. `str` 변수의 선언이 누락되었습니다. 함수 매개변수로는 `strs`가 사용되고 있으므로, 
    //    `str`을 새로 선언하거나 `strs`를 사용해야 합니다.
    str = str.toUpperCase(); // 오타: `toUpprCase()`가 아닌 `toUpperCase()`로 수정해야 합니다.
    
    // 2. `alpabets` 배열에서 각 문자는 따옴표로 감싸져야 합니다. 현재는 변수로 인식되기 때문에 오류가 발생합니다.
    let alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
    
    // 3. 결과를 저장할 객체를 함수 시작 부분에서 생성해야 합니다.
    const answer = {};

    // 4. 변수 `alphabet`에서 오타가 있습니다. `alpabet`이 아닌 `alphabet`이어야 합니다.
    for (let alphabet of alphabets) {
        
        // 5. `let anser`는 불필요한 선언입니다. 대신 객체에 값을 추가해야 합니다.
        // `answer[alphabet] = 0;`으로 초기화하는 것이 좋습니다.
        answer[alphabet] = 0;

        // 6. `strs` 배열의 각 문자를 반복해야 합니다.
        for (let char of strs) {
            // 7. `$[alphabet]`는 잘못된 문법입니다. `answer[alphabet]`로 수정해야 합니다.
            // 객체의 특정 키에 접근할 때는 대괄호 표기법(`answer[alphabet]`)을 사용합니다.
            if (alphabet === char) {
                answer[alphabet] += 1; // 문자가 일치할 때 카운트 증가
            }
        } // 객체에 알파벳:카운트로 추가
    }

    return answer; // 객체 반환
}

// 8. `sparta`는 정의되지 않은 변수로 인식됩니다. 문자열로 전달하기 위해 `"sparta"`로 수정해야 합니다.
console.log(countStr("sparta"));

 

내 답

function countCharacters(str) {
    const charCount = {}; // 각 문자의 등장 횟수를 저장할 객체 생성

    for (let char of str) { // 문자열의 각 문자에 대해 반복
        if (charCount[char]) { // 이미 등장한 경우
            charCount[char] += 1; // 카운트 증가
        } else {
            charCount[char] = 1; // 처음 등장한 경우 카운트 1로 설정
        }
    }
    return charCount; // 문자별 등장 횟수가 담긴 객체 반환
}

// 테스트
console.log(countCharacters("spartan")); 
// 예상 출력: { s: 1, p: 1, a: 2, r: 1, t: 1, n: 1 }

 

 

강의

더보기

힌트

function countCharacters(str) {
    // 여기를 채우면 됩니다!
    return ... // 잘은 모르겠으나 str의 문자 개수를 센 무언가를 리턴해야 함!
}
/////////////////////////
let charCount = {}; // 오옷. 처음 보는 분들이 계시겠죠?
////////////////////////
for (let i = 0; i < str.length; i++) {
    const char = str[i];
    // char의 값을 기반으로 카운팅을 해야죠!
}
////////////////////////
for (let i = 0; i < str.length; i++) {
    const char = str[i];
    if (charCount[char]) {
        charCount[char]++;
    } else {
        charCount[char] = 1;
    }
}
///////////////////////

 

모범답

function countCharacters(str) {
    let charCount = {};
    for (let i = 0; i < str.length; i++) {
        const char = str[i];
        if (charCount[char]) {
            charCount[char]++;
        } else {
            charCount[char] = 1;
        }
    }
    return charCount;
}

Q2 연습 문제. 주어진 단어의 각 문자를 하나씩 뒤로 이동하여 만들어진 모든 회전된 단어를 출력하세요. 
                예를 들어, 입력을 "abc"로 받으면 출력은 ["abc", "bca", "cab"]로 출력하면 됩니다.

 

 

 

내답

function rotate(strs) {
    let rot = []; // 회전된 문자열들을 저장할 배열
    for (let i = 0; i < strs.length; i++) {
        let str1 = strs.substring(0, i); // 앞 부분
        let str2 = strs.substring(i); // 뒷 부분
        rot.push(str2 + str1); // 회전된 문자열을 배열에 추가
    }
    return rot;
}

console.log(rotate("abc"));

 

강의

더보기

문장 자르기는 slice

// 코드로 옮기기 위해선 패턴을 분석해보겠죠. abc → bca로 만들려면 a만 끝쪽에 옮기면 되니까요. 이걸 하기 위해선 문자열을 슬라이싱 할 줄 알아야 합니다.
// 그러면, bc + a 느낌으로 조합을 하면 자연스럽겠죠. bc는 [1, 2]고 a는 [0]이니 slice로 표현하면 이렇게 될 수 있습니다. 
word.slice(1) + word[0] // "bc" + "a"

slice(x) + slice(0,x)

 

모범답

function rotateWord(word) {
    let rotations = [];
    for (let i = 0; i < word.length; i++) {
        let rotated = word.slice(i) + word.slice(0, i);
        rotations.push(rotated);
    }
    return rotations;
}

console.log(rotateWord("abc")); // ["abc", "bca", "cab"]