CodingTest
Day5: A 강조하기, 특정한 문자를 대문자로 바꾸기, 조건에 맞게 수열 변경하기 1, 2, 3
curious week
2025. 8. 28. 15:32
A 강조하기:
a는 모두 대문자로, 나머지는 소문자로 변환하여 리턴
function solution(myString) {
return [...myString].map((v) => v === 'a' || v === 'A'? 'A': v.toLowerCase()).join('')
}
다른 답:
const solution = s => s.toLowerCase().replaceAll('a', 'A');
replaceAll(a, b): a를 b로 찾아 바꿈.
function solution(myString) {
return [...myString].map(str => ['a', 'A'].includes(str)? 'A' : str.toLowerCase()).join('');
}
includes(a): a가 포함되면 true 아니면 false
특정한 문자를 대문자로 바꾸기:
주어진 알파벳만 대문자로 바꾸기
function solution(my_string, alp) {
return my_string.replaceAll(alp, alp.toUpperCase());
}
다른 답:
function solution(my_string, alp) {
let re = new RegExp(alp, "g");
return my_string.replace(re, alp.toUpperCase());
}
- new RegExp(pattern, flags) : 정규표현식 객체를 만듭니다.
- alp : 바꿀 대상 문자. 예) "a"
- "g" : global 플래그로, 문자열 전체에서 모든 "a"를 찾겠다는 뜻.
- g: 전역 검색, i: 대소문자 구분 없음, m: 여러 줄 검색 등
조건에 맞게 수열 변환하기 1:
배열에서 50보다 큰 수 중 짝수는 2로 나누고, 50보다 작은 수 중 홀수는 2를 곱한다.
function solution(arr) {
return arr.map((v) => v >= 50 ? (v % 2 == 0? v / 2: v): (v % 2 == 1? v * 2 : v))
}
다른 답:
function solution(arr) {
for (const [ i, num ] of arr.entries()) {
if (num >= 50 && num % 2 === 0) {
arr[i] /= 2;
} else if (num < 50 && num % 2 === 1) {
arr[i] *= 2;
}
}
return arr;
}
- arr.entries() → [index, value] 쌍을 하나씩 내보내는 이터레이터 객체 반환.
- 인덱스와 값이 모두 필요하고, for...of 루프 문맥이 편할 때 사용한다.
- 인덱스만 필요하면 .keys(), 값만 필요하면 .values()
주의 사항:
- 요소 추가/삭제(예: push, splice)로 길이나 인덱스 배치를 바꾸면, 순회 흐름이 꼬일 수 있다.
- arr.entries()는 Object.entries(obj)와 다르다
- Object.entries(obj)는 객체의 (키, 값) 쌍을 배열로 반환
- arr.entries()는 배열 전용의 이터레이터이며, 키는 숫자 인덱스
조건에 맞게 수열 변환하기 2:
조건에 맞게 수열 변환하기1과 같은 조건을 반복하다보면 이전 배열과 동일한 배열이 나오게 된다. 이때 동일한 배열이 나오기 시작한 반복횟수를 리턴한다.
function solution(arr) {
let pre = []
let cur = arr
let isEqual
for(let i = 0; i <= 100; i++) {
pre = cur
cur = cur.map((v) => v >= 50 ? (v % 2 == 0 ? v / 2 : v) : (v % 2 == 1 ? (v * 2) + 1 : v))
isEqual = pre.length === cur.length && pre.every((value, index) => value === cur[index])
if(isEqual) return i
}
}
다른 답:
function solution(arr) {
var answer = 0;
let before = [-1];
while(!arr.every((e,idx) => e == before[idx])) {
before =[...arr];
arr = arr.map(e => {
if(e >= 50 & e % 2 == 0)
return e / 2;
if(e < 50 & e % 2 != 0)
return e * 2 + 1;
return e;
})
answer++;
}
return answer - 1;
}
while문이 더 깔끔하고 조건에 맞다.
function solution(arr, count = 0) {
const temp = [...arr].map((n) => n >= 50 && !(n % 2) ? n / 2 : n < 50 && n % 2 ? n * 2 + 1 : n);
if (arr.every((n, i) => n === temp[i])) return count;
return Math.max(count, solution(temp, count + 1));
}
조건에 맞게 수열 변경하기 3:
k가 홀수면 배열에 k를 곱하고, k가 짝수면 k를 더한다.
function solution(arr, k) {
return arr.map((v) => k % 2 == 0 ? v + k : v * k)
}