Algorithm Basic_#3

const_yang·2021년 8월 11일
0

Algorithm Basic

목록 보기
3/4
post-thumbnail

문제 09 📓

문자열을 입력받아 문자열 내에 아래 중 하나가 존재하는지 여부를 리턴해야 합니다.
'a'로 시작해서 'b'로 끝나는 길이 5의 문자열
'b'로 시작해서 'a'로 끝나는 길이 5의 문자열

- 입출력

  • 입력: string 타입의 알파벳 문자열
  • 출력: boolean 타입

- 입출력 예시

let output = ABCheck('lane Borrowed');
console.log(output); // --> true

- 나의 풀이

1) 모든 문자를 소문자 또는 대문자로 바꾼다.
2) 첫 문자가 a 또는 b 로 시작하고, 첫 문자에서 다섯번째 문자가 a 또는 b로 끝나고 첫 문자와 마지막 문자가 같지 않을 때만 true를 리턴한다.

function ABCheck(str) {
  let newStr = str.toLowerCase();
  for (let i = 0; i < newStr.length; i++) {
    if (newStr[i] === 'a' || newStr[i] === 'b') {
      if (newStr[i+4] === 'a' || newStr[i+4] === 'b') {
        if (newStr[i] !== newStr[i+4]) {
        return true;
      }
    }
  } 
} return false;
}

- 결과

통과 👌

- Reference code

function ABCheck(str) {
  if (str === undefined) {
    return false;
  }

  str = str.toLowerCase();

  for (let i = 4; i < str.length; i++) {
    if (
      (str[i] === 'a' && str[i - 4] === 'b') ||
      (str[i] === 'b' && str[i - 4] === 'a')
    ) {
      return true;
    }
  }

  return false;
}
  1. 빈 문자열을 위한 식을 따로 추가함
  2. 반복의 횟수를 최소한으로 줄이기 위해 네 번째 인덱스부터 반복함
  3. i - 4의 값을 비교함으로 마지막으로부터 세 번째 문자가 ab 가 나오더라도 반복 진행하지 않음
 for (let i = 0; i < str.length-4; i++) {
    if (
      (str[i] === 'a' && str[i + 4] === 'b') ||
      (str[i] === 'b' && str[i + 4] === 'a')

문제 10 📓

문자열을 입력받아 연속된 한자리 홀수 숫자 사이에 '-'를 추가한 문자열을 리턴해야 합니다.

- 입출력

  • 입력: string 타입의 숫자 문자열
  • 출력: string 타입의 숫자 문자열

- 입출력 예시

let output = insertDash('454793');
console.log(output); // --> 4547-9-3

- 나의 풀이

1) 인자값 문자열을 한 글자씩 나누어 배열을 만든다.
2) for문을 활용해 i와 i+1의 값이 홀수인지 확인한다.
3) 배열 메소드 splice를 활용하여 '-'를 두 홀수 사이에 넣는다.
4) 배열을 join 메소드로 다시 문자열로 만든다

function insertDash(str) {
  let arr = str.split('');
  for(let i=0; i < arr.length; i++) {
    if (Number(arr[i]) % 2 === 1 && Number(arr[i+1]) % 2 === 1) {
    arr.splice(i+1, 0, '-');
    }
  } return arr.join('');
}

- 결과

통과 👌

- Reference code

function insertDash(str) {
  let result = str[0];
  for (let i = 1; i < str.length; i++) {
    if (Number(str[i - 1]) % 2 && Number(str[i]) % 2) {
      result = result + '-';
    }
    result = result + str[i];
  }

  return result;
}

새 변수 result에 값에 문자열 첫 번째 인덱스 값을 할당하고 시작.
반복문은 인덱스 1번 부터 확인.

문제 11 📓

문자열을 요소로 갖는 배열을 입력받아 가장 짧은 문자열과 가장 긴 문자열을 제거한 배열을 리턴해야 합니다.

- 입출력

  • 입력: string 타입을 요소로 갖는 배열 / arr[i].length는 20 이하
  • 출력: 배열

- 입출력 예시

let output = removeExtremes(['a', 'b', 'c', 'def']);
console.log(output); // --> ['a', 'b']

output = removeExtremes(['where', 'is', 'the', 'longest', 'word']);
console.log(output); // --> ['where', 'the', 'word',]

- 나의 풀이

1) 인자값 배열에서 가장 긴 문자와 짧은 문자를 뒤에서부터 지정한다.
2) for문으로 인자값 배열을 뒤에서부터 조회하고 긴 문자의 길이보다 길면, 긴 문자로 지정한다. 짧은 문자의 길이보다 짧으면 짧은 문자로 지정한다.
3) 배열의 filter메소드를 사용하여 긴 문자, 짧은 문자를 제외한 모든 문자를 새 배열에 넣는다.

문자를 직접 지정하다 보니, 같은 길이의 같은 문자가 인자값에 들어갈 때 정확한 결과를 얻지 못했다.
테스크 케이스 7개 중 6개를 통과했지만, 이 이슈를 결국 풀지 못했다.🧐

function removeExtremes(arr) {
  // TODO: 여기에 코드를 작성합니다.
  // 같은 값 빈 문자열의 경우...

let longestWord = arr[arr.length - 1];
let shortestWord = arr[arr.length - 2];

for (i = arr.length - 1; i >= 0; i--) {
if (arr[i].length > longestWord.length) {
longestWord = arr[i];
} else if (arr[i].length < shortestWord.length) {
shortestWord = arr[i];
}
} let newArr = arr.filter((el) => el !== longestWord);
let new2Arr = newArr.filter((el) => el !== shortestWord);
return new2Arr;
}

### - 결과
통과 못함 🙄

### - Reference code
```js
function removeExtremes(arr) {
  let shortestLen = 20;
  let longestLen = 0;
  let shortestIdx = 0;
  let longestIdx = 0;
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].length >= longestLen) {
      longestLen = arr[i].length;
      longestIdx = i;
    }

    if (arr[i].length <= shortestLen) {
      shortestLen = arr[i].length;
      shortestIdx = i;
    }
  }

  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (i !== shortestIdx && i !== longestIdx) {
      result.push(arr[i]);
    }
  }

  return result;
}

1) for문을 처음부터 조회해도 "같은" 조건을 사용하면 가장 뒤에 있는 값이 결국 찾고자 하는 값을 찾을 수 있다.
2) 특정 문자를 긴 문자, 짧은 문자로 지정하지 않고, 최대 길이와 최소 길이를 기준 값으로 하고 길이 보다 길거나 짧은 것을 반복 비교하였다.
3) 인덱스 값을 따로 지정하는 것과 해당 인덱스 값이 아닌 모든 값을 새로운 배열에 추가하는 것은 생각까지 모두 했는데 정작 구현하지 못한 점이 아쉽다.

문제 12 📓

2차원 배열(배열을 요소로 갖는 배열)을 입력받아 'B'의 위치 정보를 요소로 갖는 배열을 리턴해야 합니다.

입출력 (주의사항)

  • 입력: 배열을 요소로 갖는 배열 / arr[i]는 'A' 또는 'B'만을 요소로 갖는 배열
  • 출력: 'B'의 위치 정보(행, 열)를 요소로 갖는 배열 / 배열의 요소는 차례대로 행, 열([행, 열])
    행: 'B'를 요소로 갖는 배열 arr[i]의 인덱스 i / 열: arr[i]에서 'B'(arr[i][j])의 인덱스 j
  • 주의: arr, arr[i]의 길이는 다양 / 항상 한 개의 문자열 'B'가 존재

입출력 예시

let output = findBugInApples([['A'], ['B']]);
console.log(output); //[1, 0]

output = findBugInApples([
  ['A', 'A', 'A', 'A', 'A'],
  ['A', 'B', 'A', 'A', 'A'],
  ['A', 'A', 'A', 'A', 'A'],
  ['A', 'A', 'A', 'A', 'A'],
  ['A', 'A', 'A', 'A', 'A'],
]);
console.log(output); //[1, 1]

나의 풀이

1) 이중 for문으로 배열 내 배열을 조회한다. 조회하는 값이 "B"인 경우 해당 인덱스 값을 리턴한다.

function findBugInApples(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
      if (arr[i][j] === 'B') {
        return [i, j]
      }
    }
  } 
}

- 결과

통과 👌

0개의 댓글