[ 문제 ]
간단한 문제이다.(하지만 난 조금 헤맸다..ㅎ)
문자열로 된 요소를 갖는 배열에서 요소들을 세로로 읽었을 때의 문자열을 반환하는 것이다.
입출력 예시를 보면, ['hello', 'wolrd']라는 배열을 입력받으면, 세로로 읽어 'hweolllrod'라는 값을 반환하는 것.
여기서 주의사항은, 모든 문자열의 길이가 동일한건 아니므로 만약 비어있는 건 무시한다.
['hi', 'wolrd']라는 배열을 입력받는다면, 'hwio'이후에는 hi뒤가 비어있다. 이럴 경우에는 무시하고 'lrd'가 오는 것이다.
[ 풀이 ]
나의 로직은 다음과 같다.
1/ 먼저 가장 긴 문자열의 길이를 구한다.
2/ 그 문자열 길이만큼 반복문을 돌리고, 이중 반복문으로 입력받은 배열의 길이만큼 해당 인덱스의 문자열을 추가한다.
function readVertically(arr) {
//먼저 가장 긴 문자열의 길이를 구한다.
let longest = 0; //일단 변수를 선언하고, 0 값을 할당한다.
for(let i = 0; i < arr.length; i++){ //반복문을 이용하여 arr의 가장 긴 문자열의 길이를 구한다.
if(arr[i].length >= longest){
longest = arr[i].length
}
}
let str = "";
for(let i = 0; i < longest; i++){ //가장 긴 문자열의 길이만큼 반복문 돌린다.
for(let j = 0; j < arr.length; j++){ //여기서는 arr의 길이만큼 반복문을 돌려 해당인덱스값을 합친다.
if(!arr[j][i]){ //만약 해당 인덱스의 값이 비어있다면 continue를 이용하여 이번 반복문은 스킵한다.
continue;
} else { //해당 인덱스의 값이 있다면 기존 str에 해당 값을 붙여준다.
str = str + arr[j][i]
}
}
}
return str; //str을 반환한다.
}
예전에 푼 풀이를 한번 살펴보자.
function readVertically(arr) {
let longestElement = arr.reduce(function(acc,cur){ //고차함수 reduce를 이용하여 가장 긴 문자열을 구한다.
if(cur.length >= acc.length){
return cur;
} else {
return acc;
}
});
let result = '';
for(let i = 0; i < longestElement.length; i++){ //가장 긴 문자열 길이만큼 반복문을 돌린다.
for(let j = 0; j < arr.length; j++){ //이중 반복문으로 입력받은 배열의 길이만큼 돌린다.
if(arr[j][i] === undefined){ //만약 해당 값이 없다면 continue.
continue;
}
result = result + arr[j][i];
}
} return result; //result값을 반환한다.
}
로직은 거의 동일하고, 가장 긴 문자열을 구할때 고차함수 reduce를 사용한 부분이 조금 다르다.
(reduce함수 다시 복습해야겠다....)
[ 레퍼런스 ]
레퍼런스를 보고 처음에는 약간 이해하기가 힘들었다.
그래서 손으로 하나하나 써서 이해를 했다.
만약 arr가 ['hello', 'world']라고 한다면,
이중반복문을 통해 temp가 ['hw', 'eo', 'lr', 'll', 'od'] 배열이고
두번째 반복문을 이용하여 안에 있는 요소들을 다 이어붙여주어 'hweolrllod'로 만드는 로직이다.
이런 방법도 있다니.. 신기했다.