7주차 알고리즘 테스트

majungha·2023년 4월 28일
1

알고리즘

목록 보기
38/71

오늘의 알고리즘 테스트 👍

📝 1. 하이픈 추가 ( addDash )


  • 공백이 존재하지 않는 영어 문자열이 주어집니다.
  • 해당 문자열에는 연속으로 반복되는 알파벳들이 존재합니다.
  • 연속되는 알파벳을 탐색하고, 해당되는 두 알파벳 사이에 하이픈(-)을 추가한 문자열을 리턴해주세요.
  • 문자열은 모두 소문자로 구성되어 있습니다.

▷ 입출력 예

addDash('seoullaarizona') // 'seoul-la-arizona'
addDash('toasttoasttoast') // 'toast-toast-toast'

▷ 내 풀이

function addDash(str) {
  // 여기에서 작업하세요.
  let result = str[0];
  for (let i = 1; i < str.length; i++) {
    if (str[i] === str[i - 1]) {
      result += "-" + str[i];
    } else {
      result += str[i];
    }
  }
  return result;
}

▷ 레퍼런스 코드

function addDash(str) {
  let result = str[0]
  for(let i=1; i<str.length; i++) {
    if(str[i-1] === str[i]) result += '-'
    result += str[i]
  }
  return result
}

📝 2. 크리스마스 선물 ( christmasPresent )


  • 숫자가 담긴 배열 childs가 주어집니다.

  • 모든 집에 한 명씩의 아이가 살고 있는 동네가 있습니다.

  • 아이들은 올해 몇 개의 착한일을 했는지에 따라 곧 다가오는 크리스마스에 선물을 받게 됩니다.

  • childs 배열에는 각 아이들이 올해 몇번의 착한 일을 했는지, 그 숫자가 담겨 있습니다.

  • 모든 아이가 아래 주어진 조건에 맞춰 올바른 개수의 선물을 받을 수 있도록 준비해야 합니다.

  • 각 아이들은 최소 하나의 선물은 받아야 합니다.

  • 이웃하고 있는 아이보다 착한 일을 더 많이 한 아이는 이웃한 아이보다는 더 많은 선물을 받아야 합니다.

  • 산타가 조건에 맞춰 아이들에게 선물을 나눠줄 때, 최소 몇개의 선물이 필요한지 그 개수를 리턴해 주세요.

▷ 입출력 예

christmasPresent([1, 0, 2]) // 5
christmasPresent([1, 2, 2]) // 4

▷ 내 풀이

const christmasPresent = function (childs) {
  // 여기에서 작업하세요.
  let present = [];
  for (let i = 0; i < childs.length; i++) {
    present.push(1);
  }

  for (let i = 1; i < childs.length; i++) {
    if (childs[i] > childs[i - 1]) {
      present[i] = present[i - 1] + 1;
    }
  }

  for (let i = childs.length - 1; i >= 0; i--) {
    if (childs[i] > childs[i + 1] && present[i] <= present[i + 1]) {
      present[i] = present[i + 1] + 1;
    }
  }

  console.log(present);

  let result = 0;

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

  return result;
};

▷ 레퍼런스 코드

const christmasPresent = function (childs) {
  // 여기에서 작업하세요.
  const temp = new Array(childs.length).fill(1);
  const [left, right] = [[...temp], [...temp]];

  for (
    let i = 0, j = childs.length - 1;
    i < childs.length && j >= 0;
    i++, j--
  ) {
    if (childs[i] > childs[i - 1]) left[i] = left[i - 1] + 1;
    if (childs[j] > childs[j + 1]) right[j] = right[j + 1] + 1;
  }

  return left.reduce((acc, cur, idx) => {
    return acc + Math.max(cur, right[idx]);
  }, 0);
};

📝 3. 도메인 ( domain )


  • 도메인이란, 웹사이트를 접속하는 과정에서 복잡한 IP 주소를 대신해
  • 직관적이고 외우기 쉬운 이름으로 대체해준 것을 말합니다.
  • 도메인은 최상위 도메인, 2차 도메인, 3차 도메인 등으로 이루어집니다.
  • 주어지는 요소 내의 알파벳은 모두 소문자입니다.
  • 리턴되는 배열에는 n차 도메인부터 최상위 도메인까지 모두 포함되어야 합니다.
  • 리턴되는 배열 내 요소들의 순서는 테스트에 영향을 주지 않습니다.

▷ 입출력 예

domain(['100 codebootcamp.co.kr', '50 naver.co.kr', '1 co.kr']) // ['100 codebootcamp.co.kr', '50 naver.co.kr', '151 co.kr', '151 kr']
domain(['900 google.mail.com', '50 naver.com', '1 intel.mail.com', '5 wiki.org']) // ['901 mail.com', '50 naver.com', '900 google.mail.com', '5 wiki.org', '5 org', '1 intel.mail.com', '951 com']

▷ 해결 못함 ❌

▷ 레퍼런스 코드

function domain(domainList) {
  // domain의 방문수를 누적, 체크하기 위한 객체
  let count = {};

  domainList.forEach(( dm ) => {
		// 방문수와 domain을 분리
    const [ visits, domains ] = dm.split(' ')

    const subDomains = domains.split('.')
		// 각 n차 domain을 분리해 while문에 적용
    while( subDomains.length ) {
			// 최하위 도메인부터 차례대로 체크
      const sub = subDomains.join('.')
			// count 객체에 해당 domain이 존재한다면 visits 증가, 아니라면 추가
      count[sub] = count[sub] ? (Number(count[sub]) + Number(visits)) : visits;
			// 확인이 끝난 도메인 제거 후 반복
      subDomains.shift()
    }
  })

  // 계산이 끝난 domain 목록을 배열에 담기
  const result = []
  for(let key in count) {
    result.push(`${count[key]} ${key}`)
  }
  return result;
}

📝 4. 문자열 회전


  • 두개의 문자열 str과 goal이 주어집니다.
  • str의 가장 뒷 문자를 맨 앞으로 보내는 과정만을 반복해
  • goal과 완전히 같은 문자열이 될 수 있는지 확인한 뒤,
  • 가능하다면 true를, 불가능하다면 false를 리턴해 주세요.
  • 문자열 str, goal의 요소는 모두 알파벳 소문자입니다.
  • 두 문자열 내에 공백은 존재하지 않습니다.

▷ 입출력 예

rotateString('abcde', 'deabc') // true
rotateString('abcde', 'cdeba') // false

▷ 내 풀이

function rotateString(str, goal) {
  // 여기에서 작업하세요.
  if (str.length !== goal.length) {
    return false;
  }

  for (let i = 0; i < str.length; i++) {
    if (str === goal) {
      return true;
    }
    str = str[str.length - 1] + str.slice(0, str.length - 1);
  }

  return false;
}

▷ for문 레퍼런스 코드

function rotateString(str, goal) {
  // 여기에서 작업하세요.
  for (let word of str) {
    str = str.slice(1) + word;
    if (str === goal) return true;
  }
  return false;
}

▷ includes 레퍼런스 코드

function rotateString(str, goal) {
  // 여기에서 작업하세요.
  const goalCheck = (goal + goal).includes(str);
  return goalCheck && str.length === goal.length;
}

출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글