본문 바로가기

카테고리 없음

13_readVertically

[ 문제 ]

간단한 문제이다.(하지만 난 조금 헤맸다..ㅎ)

문자열로 된 요소를 갖는 배열에서 요소들을 세로로 읽었을 때의 문자열을 반환하는 것이다.

입출력 예시를 보면, ['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'로 만드는 로직이다.

 

이런 방법도 있다니.. 신기했다.