항해99_7기/2주차 알고리즘 기초 주차 스터디

[항해99] programmers 코딩테스트 연습문제 21~23

code10 2022. 5. 16. 17:54

[항해99] 프로그래밍 기초 주차 / 달리기반 / 7기 / D반 / 9조

 

코딩테스트 연습문제

21. 이상한 문자 만들기

(문제)

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

입출력 예시 s , return

"try hello world" "TrY HeLlO WoRlD"

(제출 답)

function solution(s) {
    var answer = s.split(' ').map((x, i) => { //i 없어도 됨. (x,i) -> (x)
        var word = x.split('').map((y, j) => {
            if (j % 2 == 0) return y.toUpperCase()
                    else return y.toLowerCase()
        })
        return word.join('')
    })
    return answer.join(' ')
}

풀이 과정

//let s = "try hello world"
console.log(s.replace(/ /g,"")); //tryhelloworld 공백제거
console.log(s.toUpperCase()); //TRY HELLO WORLD 알파벳 대문자로 모두 변환
console.log(s.toLowerCase()); //try hello world 알파벳 소문자로 모두 변환
 
//단어 내에서, 0번째(짝수번째)와 공백 다음의 인덱스 자리 찾기?? charAt? => 단어 길이가 제각각.. 한 글자씩 바꾸기 어렵..
// >쪼개어 합치기 선택 . 먼저, 공백 기준으로 쪼개고(split)
(console.log(s.split(' ')); // [ 'try', 'hello', 'world' ] 공백 스페이스 넣어줘야 함.)
//모든 요소에 대해 함수를 실행하기 위해 map 이용. 
//쪼개진 요소를 다시 split함수로 쪼개어 ['t', 'r', 'y'] 알파벳 대소문자 변환하기 toUpperCase 또는 toLowerCase 사용
//나눈 요소를 다시 붙이기 join
//공백 넣어서 다시 붙이기 join
 
join 함수
const arr = ['바람', '비', '물'];

console.log(arr.join());
// 바람,비,물

console.log(arr.join(''));
// 바람비물

console.log(arr.join('-'));
// 바람-비-물

 

🤼‍♀️ 다른 풀이 1 (간결해짐)

function solution(s) {
  return s.split(' ').map((a) => {
    return a.split('').map((b, i) => {
      return (i % 2 === 0) ? b.toUpperCase() : b.toLowerCase();
    }).join('');
  }).join(' ');
}

🤼‍♀️ 다른 풀이 2 (forEach 구문 이용한)

let result = split.map(function(item, index, array)){
}
// forEach(func) – 모든 요소에 func을 호출함. 결과는 반환되지 않음
function solution(s) {
    var split = s.split(' '); // ["try", "hello", "world"]
    var answer = '';
    split.forEach(function(v, i){
        var spl = split[i].split(''); // ["t", "r", "y"]
        var newspl = spl.map(function(al, j){
            if(j%2==0){ //짝수
                return al.toUpperCase()
            } else {
                return al.toLowerCase()
            }
        })
        answer += ' ' + newspl.join('') //공백 넣어 합치기
    })
    return answer.trim(); //trim함수는 양 끝 공백 제거
}

🤼‍♀️ 다른 풀이 3

function toWeirdCase(s){
  return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})
}

추가학습

charAt() 과 대괄호[] : 특정 글자에 접근하기

let str = `Hello`;

// 첫 번째 글자
alert( str[0] ); // H
alert( str.charAt(0) ); // H

// 마지막 글자
alert( str[str.length - 1] ); // o

근래에는 대괄호를 이용하는 방식을 사용합니다. charAt은 하위 호환성을 위해 남아있는 메서드라고 생각하시면 됩니다.

두 접근 방식의 차이는 반환할 글자가 없을 때 드러납니다. 접근하려는 위치에 글자가 없는 경우 []는 undefined를, charAt은 빈 문자열을 반환합니다.

let str = `Hello`;

alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (빈 문자열)

 

화살표 함수 공부

https://ko.javascript.info/arrow-functions-basics

 

함수 func는 화살표(=>) 우측의 표현식(expression)을 평가하고, 평가 결과를 반환

인수가 하나도 없을 땐 괄호를 비워놓으면 됩니다. 다만, 이 때 괄호는 생략할 수 없습니다.

let age = prompt("나이를 알려주세요.", 18);

let welcome = (age < 18) ?
  () => alert('안녕') :
  () => alert("안녕하세요!");

welcome();
function ask(question, yes, no) {
  if (confirm(question)) yes()
  else no();
}

ask(
  "동의하십니까?",
  () => alert("동의하셨습니다."),
  () => alert("취소 버튼을 누르셨습니다.")
);

map 함수 공부

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map

map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환

arr.map(callback(currentValue[, index[, array]])[, thisArg])

callback : 새로운 배열 요소를 생성하는 함수 

        currentValue : 처리할 현재 요소

        index : 처리할 현재 요소의 인덱스

        array : map()을 호출한 배열

thisArg : callback 실행할 때 this로 사용되는 값

반환값은 배열의 각 요소에 대해 실행한  callback의 결과를 모은 새로운 배열.

var kvArray = [{key:1, value:10},
               {key:2, value:20},
               {key:3, value: 30}];

var reformattedArray = kvArray.map(function(obj){
   var rObj = {};
   rObj[obj.key] = obj.value;
   return rObj;
});
// reformattedArray는 [{1:10}, {2:20}, {3:30}

22. 자릿수 더하기

(문제)

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.제한사항

  • N의 범위 : 100,000,000 이하의 자연수

(제출 답)

function solution(n)
{
    var x = n.toString().split("")

    let result = x.map(x => parseInt(x)).reduce((sum, cur) => sum + cur, 0);

    return result;
}

 풀이 과정

let N = 123

//숫자를 문자열로 변환하기
let x = N.toString()
console.log(x); //123 (문자)
//각 자리 쪼개기
x = x.split("")
console.log(x); // [ '1', '2', '3' ]
//문자열을 다시 숫자로 parseInt() , 모든 요소를 바꿀 것이므로 map 이용
//reduce 함수 연습
let result = x.map(x => parseInt(x)).reduce((sum, cur) => sum + cur);

console.log(result) // 6

🤼‍♀️ 다른 풀이 (for 문을 이용한 방법도 알고, reduce 이용해서 한 줄로 표현하는 방법도 아는 분! 숫자인 문자에 1을 곱하면 문자열이 숫자로 바뀐당

function solution(n)
{
    var a = (n + '').split('');
    var b = 0;
    for(var i = 0; i < a.length; ++i) {
        b += parseInt(a[i]);
    }
    return b;
    //return n.toString().split('').reduce((a, b) => (a * 1) + (b * 1));
}

 

 추가학습

23. 자연수 뒤집어 배열로 만들기

(문제)

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

제한 조건

  • n은 10,000,000,000이하인 자연수입니다.

(제출 답)

function solution(n) {
    return n.toString().split('').reverse().map((a)=> Number(a)) 
}

 

 풀이 과정

// 22번 문제처럼,, 숫자를 문자열로 변환하고, 쪼갠 다음에, 마지막 인덱스부터 불러와서 새 배열로 만들기

let N = 12345

var answer = [];
answer = N.toString().split('')
console.log(answer); //[ '1', '2', '3', '4', '5' ]

answer2 = answer.reverse()
console.log(answer2); // [ '5', '4', '3', '2', '1' ]

//var answer3 = [answer2.join()]; //[ '5,4,3,2,1' ] 윽 작은따옴표 '' 없어져! .. 이거 아님.
var answer3 = answer2.map((a) => Number(a))
console.log(answer3) //[ 5, 4, 3, 2, 1 ] 성공.

//한 줄로 합치기.

🤼‍♀️ 다른 풀이 (멋있당.. 문자풀이도 축약할 수 있는 걸 발견. 수학 풀이는 ..!!! 속도도 더 빠른 듯.. )

function solution(n) {
    // 문자풀이
    // return (n+"").split("").reverse().map(v => parseInt(v));

    // 숫자풀이
    var arr = [];

    do {
        arr.push(n%10);
        n = Math.floor(n/10);
    } while (n>0);

    return arr;
}

 추가학습