[항해99] programmers 코딩테스트 연습문제 21~23
[항해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(' ')
}
✅ 풀이 과정
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 구문 이용한)
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;
}
✅ 풀이 과정
🤼♀️ 다른 풀이 (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번 문제처럼,, 숫자를 문자열로 변환하고, 쪼갠 다음에, 마지막 인덱스부터 불러와서 새 배열로 만들기
🤼♀️ 다른 풀이 (멋있당.. 문자풀이도 축약할 수 있는 걸 발견. 수학 풀이는 ..!!! 속도도 더 빠른 듯.. )
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;
}
⏩ 추가학습