일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 우분투 시간 변경
- ${변수}
- 프론트엔드 스쿨
- search()
- Robo3T 글씨키우기
- 리엑트블로거
- Robo3T 폰트변경
- 가상컴퓨터마법사
- 객체를 배열로
- 문자열 인터폴레이션
- 깃 토큰 만료
- Robo3T 글씨체 변경
- 레디스 확인
- 5.3.8 Modifying Queries
- indexOf()
- ubuntu타임존
- 객체의키값만 찾기
- Robo3T 폰트 키우기
- 스프링 데이타 JPA
- 객체의 밸류값만 찾기
- 배열을 객체로
- lastIndexOf()
- sql 문자열 패턴 검색
- ...점점점문법
- 코딩 어?
- js 문자열을 문자배열로
- @Moditying @Query
- 시퀄 문법
- sql like연산자
- findIndex()
- Today
- Total
코딩기록
53.string) 문자열 섞기 / 문자열을 배열로 (문자열배열) 변경 할땐 ? .split('') 말고 스프레드 문법으로!! [... ] (문자열 두개 번갈아 출력) 풀이4개 / 이중포문 본문
53.string) 문자열 섞기 / 문자열을 배열로 (문자열배열) 변경 할땐 ? .split('') 말고 스프레드 문법으로!! [... ] (문자열 두개 번갈아 출력) 풀이4개 / 이중포문
뽀짝코딩 2024. 8. 11. 20:05문제 설명
길이가 같은 두 문자열 str1과 str2가 주어집니다.
두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.
제한사항
- 1 ≤ str1의 길이 = str2의 길이 ≤ 10
- str1과 str2는 알파벳 소문자로 이루어진 문자열입니다.
입출력 예
str1 | str2 | result |
"aaaaa" | "bbbbb" | "ababababab" |
const solution = (str1, str2) => {
// do something
};
console.log(solution('aaaaa', 'bbbbb')); // 'ababababab'
풀이1. map, concat 으로 문자 뒤에 문자 붙여 배열로 반환
1-1. 문자열을 배열에 문자 하나하나 담기. => 문자열을 문자배열로 바꾸기
split 메서드로 빈 문자열을 인수로 전달해서 문자를 하나하나 분리해서,
문자열 배열로 만듬었는데 split(' ') 보다 스프레드문법(전개문법)이 더 간편하다
split('') => console.log(('aaaaa').split('')); // [ 'a', 'a', 'a', 'a', 'a' ]
스프레드문법(전개문법) [... ] => console.log([...'bbbbb']); // [ 'b', 'b', 'b', 'b', 'b' ]
1-2. map 으로 str1 문자 배열을 돌면서 str1 요소값('a') 뒤에 str2인덱스를 하나씩 붙인다.
map(요소값, 인덱스) 이렇게 작성하는데 'a' 문자5개가 배열로[ 'a', 'a', 'a', 'a', 'a' ] 만들어진 str1 배열의 요소를 c로 받아 배열 안을 map으로 반복적으로 도는데,
concat으로 그 뒤에 str2도 'b' 문자5개로 이뤄진 배열을[ 'b', 'b', 'b', 'b', 'b' ] 만들어 그 배열 인덱스 하나하나를 c뒤에 붙인다.
c가 한번 str1을 돌때 str2인덱스가 str1뒤에 하나씩 붙게 된다.
그래서 ['ab' 'ab' 'ab' 'ab' 'ab'] 이렇게 배열안에 두개씩 붙여서 인덱스 길이만큼 값이 나온다.
1-3. 배열을 문자열로 반환 join(' '); 조인함수로 문자열로 만들어 반환.
1-2번에서 만든 ['ab' 'ab' 'ab' 'ab' 'ab']를 join함수로 문자열
ababababab 값으로 만들어 최종 반환한다.
❗❗join.(''); 함수가 없으면 배열에 문자열 a와 b가 더한 값이 인덱스 길이만큼 반복적으로 들어가서
[ 'ab', 'ab', 'ab', 'ab', 'ab' ] 이렇게 값이 만들어짐.
- join 메서드는 원본 배열의 모든 요소를 문자열로 변환한 후, 인수를 전달받은 문자열, 즉 구분자(separator)로 연결한 문자열을 반환.
const solution = (str1, str2) => {
// console.log([...str1]); // [ 'a', 'a', 'a', 'a', 'a' ]
// console.log([...str2]); // [ 'b', 'b', 'b', 'b', 'b' ]
//map 함수안에서 출력시
// console.log([...str1[i]]); // [ 'a' ] * 5(인덱스 수만큼, 조심!!)
// console.log([...str2]); // [ 'b', 'b', 'b', 'b', 'b' ] * 5(인덱스 수만큼, 조심!!)
// return [...str1].flatMap((c, i) => c.concat([...str2[i]])).join('');
return [...str1].map((c, i) => c.concat([...str2[i]])).join('');
};
console.log(solution('aaaaa', 'bbbbb')); // 'ababababab'
풀이2. 고차배열함수 map, 더하기 연산자 +
풀이1보다 더 쉬운 풀이가 있다.
풀이1은 concat을 썼는데 문자열또한 이터러블이라는 점을 고려해서 바로 더하기 연산자로 문자열인덱스를 하나씩 더한다.
2-1. 문자열을 배열에 문자 하나하나 담기. => 문자열을 문자배열로 바꾸기
2-2. map 으로 str1 문자 배열을 돌면서 str1 요소값('a') 뒤에 str2인덱스를 하나씩 붙인다.
1-2번에서 concat과 스프레드문법을 같이썼는데 .concat([...str2[i]])
더하기 연산자와 문자열인덱스로 변경했다. + str2[i]
[변경 코드]
return [...str1].map((c, i) => c.concat([...str2[i]])).join('');
return [...str1].map((c, i) => c + str2[i]).join('');
풀이3. reduce
const solution = (str1, str2) => {
return [...str1].reduce((acc, cur, i) => acc + cur + str2[i], '');
};
풀이4. 2중 for문
이중 for문
이중 포문 주의할것❗❗❗
1. return
리턴은 언제나 포문 밖에서 해야함. 흔한 실수임.!
2. 이중 포문쓸때는 안쪽 포문에 항상 [i] 바깥 포문의 인덱스를 붙여야 한다.
안붙이면 아래와 같은 코드가 만들어진다.
인자 2개 str1, str2
- 1.콘솔을 보면 str1의 문자열 값이 하나씩 찍혀서 str1[i] 의 값이 1, 2, 3 으로 나온다.
- str1[i]의 첫번째 순회, i의 값은 0이고 j포문으로 들어가 4번 콘솔처럼 인덱스 [0]의 값 1과 6을 찍고
- str1인 i 포문으로 올라가서 i++을 만나 i값 0이 +1해서 1이 되고
- i포문의 i(1)가 3보다 작다는 조건식을 만족해 j포문으로 들어간다.
- 4번 콘솔처럼 인덱스 [1]의 값 2와 7을 찍고
- str1인 i 포문으로 올라가서 i++을 만나 i값 1이 +1해서 2가 되고
- i포문의 i(2)가 3보다 작다는 조건식을 만족해 j포문으로 들어간다.
- 4번 콘솔처럼 인덱스 [2]의 값 3과 8을 찍고
- str1인 i 포문으로 올라가서 i++을 만나 i값 0이 +1해서 1이 되고
- i포문의 i(3)이 3보다 작다는 조건식에서 false가 나와 식이 끝나고 return result를 반환한다.
- str1[i]의 첫번째 순회, i의 값은 0이고 j포문으로 들어가 4번 콘솔처럼 인덱스 [0]의 값 1과 6을 찍고
이중 for문 풀이
const solution = (str1, str2) => {
let result = '';
for (let i = 0; i < str1.length; i++) { // 1ab1ab1ab1ab1ab, 2ab2ab2ab2ab2ab
for (let j = 0; j < str2[i].length; j++) {
result += str1[i] + str2[i][j];
}
}
return result; //리턴은 언제나 포문 밖에서
}
}
console.log(solution('aaaaa', 'bbbbb')); // 'ababababab'
❗❗❗ 그런데 중요한것 2중 for문이 아니라 그냥 for문도 가능하다❗❗❗
풀이5. for문
const solution = (str1, str2) => {
let result = '';
for (let i = 0; i < str1.length; i++) {
result += str1[i] + str2[i];
}
return result;
};
console.log(solution('aaaaa', 'bbbbb')); // 'ababababab'
참고
*프로그래머스 53 -
https://school.programmers.co.kr/learn/courses/30/lessons/181942