Algorithm Basic_#4

const_yang·2021년 8월 24일
0

Algorithm Basic

목록 보기
4/4
post-thumbnail

문제 13 📓

문자열을 요소로 갖는 배열을 입력받아 문자열을 세로로 읽었을 때의 문자열을 리턴해야 합니다.

- 입출력

  • 입력: string 타입을 요소로 갖는 배열
  • 출력: string 타입을 리턴

- 입출력 예시

let input = [
  //
  'hello',
  'wolrd',
];
let output = readVertically(input);
console.log(output); // --> 'hweolllrod'

input = [
  //
  'hi',
  'wolrd',
];
output = readVertically(input);
console.log(output); // --> 'hwiolrd'

- 나의 풀이

1) arr[0][0] + arr[1][0] arr[0][1] + arr[1][1] arr[0][2] + arr[1][2] 식으로 이어 붙여야 한다.
2) 첫번째 인덱스는 arr의 길이
3) 두번째 인덱스는 제일 긴 문자열의 길이(다른 문자열에서 해당 인덱스값이 없는 경우 continue로 pass)
4) 문자열 인덱스를 기준으로 배열의 익덱스가 반복하고 있으므로 문자열 인덱스를 외부 for문으로, 배열 인덱스를 내부 for문으로 한다

function readVertically(arr) {
let maxLeng = 0;
for (i = 0; i < arr.length; i++) {
  if (arr[i].length > maxLeng) {
    maxLeng = arr[i].length
  }
}
let result = ''
for (let j = 0; j < maxLeng; j++) {
  for (let n = 0; n < arr.length; n++) {
    if (arr[n][j] === undefined) {
      continue
    } 
    result = result + arr[n][j]
  }
}
  return result
}

- 결과

통과 👌

- Reference code

function readVertically(arr) {
  let temp = [];
  for (let i = 0; i < arr.length; i++) {
    let str = arr[i];
    for (let j = 0; j < str.length; j++) {
      if (temp.length === j) {
        temp.push(str[j]);
      } else {
        temp[j] = temp[j] + str[j];
      }
    }
  }

  let result = '';
  for (let i = 0; i < temp.length; i++) {
    result = result + temp[i];
  }

  return result;
}
  • temp 배열의 길이와 문자열의 길이를 비교하여
    길이가 같은 경우, 길이가 긴 다른 문자열의 캐릭터가 temp 배열 뒤로 들어감.
    길이가 다른 경우, 기존의 temp 배열 자리에 새로운 문자열을 묶어 같은 인덱스 캐릭터끼리 모음.

문제 14 📓

수를 요소로 갖는 배열을 입력받아 각 요소들이 그 이전의 요소들의 합보다 큰지 여부를 리턴해야 합니다.

- 입출력

  • 입력: 수를 요소로 갖는 배열(arr[i]는 정수)
  • 출력: boolean 타입 리턴(arr[i]arr[0]부터 arr[i-1]까지의 합보다 커야함

- 입출력 예시

let output = superIncreasing([1, 3, 6, 13, 54]);
console.log(output); // --> true

output = superIncreasing([1, 3, 5, 9]);
console.log(output); // --> false

- 나의 풀이

1) for문 반복하여 인덱스 순서대로 sum에 더해준다.
2) 더하기 반복이 마친 후 다음 인덱스와 sum을 비교하고
3) sum이 다음 인덱스보다 크거나 같은 경우 false를 리턴한다.
4) 나머지의 경우 true를 리턴한다.

function superIncreasing(arr) {
  let sum = arr[0];
  let result;
  for (let i = 1; i < arr.length; i++) {
    result = true;
    sum = sum + arr[i]
    if (sum >= arr[i + 1]) {
      result = false;
      break;
  } 
}
return result
}

- 결과

통과 👌

- Reference code

function superIncreasing(arr) {
  let sum = arr[0];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] <= sum) {
      return false;
    }
    sum = sum + arr[i];
  }
  return true;
}

문제 15 📓

두 수(num1, num2)를 입력받아, num1를 num2로 나눈 나머지를 리턴해야 합니다.

- 입출력

  • 입력: number 타입의 정수 (num1 >= 0)
  • 출력: number 타입의 정수 (num2 >= 0)

- 입출력 예시

let output = modulo(25, 4);
console.log(output); // --> 1

- 나의 풀이

1) for문을 활용하여 num1을 계속 num2으로 나누어 나머지를 구한다.
2) 단 num1이 num2 보다 클 때까지만 반복해서 뺀다.

function modulo(num1, num2) {
  if (num1 === 0) {
    return 0
  }

  if (num2 === 0) {
    return 'Error: cannot divide by zero'
  }

  for (i = num1; i > 0; i = i - num2) {
    if (i < num2) {
      break
    }
  }
  return i
} 

- 결과

통과 👌

- Reference code

function modulo(num1, num2) {
  if (num2 === 0) {
    return 'Error: cannot divide by zero';
  }

  while (num1 >= num2) {
    num1 = num1 - num2;
  }

  return num1;
}

for문 대신 while문을 사용하여 좀 더 깔끔한 코딩이다. 초기문 넣지않고 증감문 하나로 식을 구현했다.

문제 16 📓

문자열을 입력받아 아이소그램인지 여부를 리턴해야 합니다. 아이소그램(isogram)은 각 알파벳을 한번씩만 이용해서 만든 단어나 문구를 말합니다.

- 입출력

  • 입력: string 타입의 공백이 없는 알파벳 문자열
  • 출력: boolean 타입

- 입출력 예시

let output = isIsogram('aba');
console.log(output); // false

output = isIsogram('Dermatoglyphics');
console.log(output); // true

output = isIsogram('moOse');
console.log(output); // false

- 나의 풀이

1) 문자열을 대문자 혹은 소문자로 일괄 정리한다.
2) for 문을 활용하여 인덱스와 다음 인덱스의 값을 비교하도록 한다.
3) 외부 for문의 범위는 마지막 인덱스 전까지만 하도록 한다. 마지막 인덱스는 이미 앞의 모든 인덱스와 비교를 했기 때문이다.

function isIsogram(str) {
  if (str.length === 0) {
    return true;
  }

  let newStr = str.toUpperCase()
  for (let i = 0; i < newStr.length - 1; i++) {
    for (let j = i + 1; j < newStr.length; j++) {
      if (newStr[i] === newStr[j]) {
        return false;
      }
    }
  }
  return true;
}

- 결과

통과 👌

- Reference code

function isIsogram(str) {
  if (str.length === 0) {
    return true;
  }

  let cache = {};
  let strLowered = str.toLowerCase();

  for (let i = 0; i < strLowered.length; i++) {
    if (cache[strLowered[i]]) {
      return false;
    }
    cache[strLowered[i]] = true;
  }

  return true;
}

객체를 활용했다. 객체의 key를 문자열의 인덱스 값으로 넣고 값은 "true"를 넣어 준다.
key 값이 들어가 있는 경우 false를 리턴하도록 했다.

0개의 댓글