9일차 알고리즘

태권·2022년 8월 9일
0

알고리즘

목록 보기
4/8

문제 1

몇시간 했더라?

경식이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다.
항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.
체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
체크아웃을 할 때 익일 시간은 24+a 로 계산한다. 즉 새벽 2시는 24+2 인 26으로 표기한다.
체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다.
따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.

function solution(arr1, arr2){
// 	return arr1.map((v,i)=> arr2[i] >= 29? 21 - v : arr2[i]-arr1[i] ).reduce((f,g)=>f+g)
// }

// let arr1=[9, 9, 9, 9, 7, 9, 8];
// let arr2=[23, 23, 30, 28, 30, 23, 23];
// console.log(solution(arr1, arr2))

arr1 ,arr2 가 주어졌을 때 각 배열의 차를 구해서 전부 더해주는 문제이다
간단하게 map을 통해 차를 구하고 삼황연산자를 통해 조건을 걸어주고 reduce로 다 더해주었다.

문제 2

신대륙발견

예지는 오늘 항해99를 시작했다. 성격이 급한 예지는 항해 1일 차부터 언제 수료를 하게될 지 궁금하다.
항해 1일 차 날짜를 입력하면 98일 이후 항해를 수료하게 되는 날짜를 계산해주는 알고리즘을 만들어보자.

function solution(month, day){
	const today =new Date(2022,month-1,day)
let endday = new Date(today)
endday.setDate(today.getDate()+ 98)
let mon = endday.toString().slice(4,7)
let daynum = endday.toString().slice(8,10)
console.log(mon,daynum)
let months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
let monnum = months.indexOf(mon)+1
console.log(mon,daynum,monnum)
    let result=`'${monnum}월 ${daynum}일'`
	return result;
}
console.log(solution(1,18))

이문제는 2016년 문제와 비슷한데
풀이도 비슷하다
setDate를 통해 getDate를 더해주고 그걸 string으로 문저열로 반환하여 원하는 값을 따롤 담아주고
월은 영어로 반환되어 숫자로 바꿔줘야기 때문에 indexof를 써서 월의 index에서 1을 더해주고 값이 대입해주면 된다 .

.padstart(길이, 문자)

  • 문자를 길이만큼 늘려주고 빈자리는 주어진 문자로 채우겠다, 왼쪽부터
    PadEnd는 오른쪽부터 채우기

문제 3

신규아이디 추천

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
function solution(new_id) {
    // step1
    new_id = new_id.toLowerCase();
    // step2  -, _, . => 정규식으로 해결
    new_id = new_id.replace(/[^\w-\._]+/g, '');
    // step3 
    new_id = new_id.replace(/[\.]{2,}/g, '.');
    // step4
    new_id = new_id[0] === '.' ? new_id.slice(1) : new_id;
    new_id = new_id[new_id.length - 1] === '.' ? new_id.slice(0, new_id.length - 1) : new_id;
    // step5
    new_id = new_id.length === 0 ? 'a' : new_id;
    // step6
    new_id = new_id.length > 15 ? new_id.slice(0, 15) : new_id;
    new_id = new_id[14] === '.' ? new_id.slice(0, 14) : new_id;
    // step7
    if (new_id.length < 3) {
        new_id = new_id + new_id[new_id.length - 1].repeat(2);
        new_id = new_id.slice(0, 3);
    }
    return new_id;
}
console.log(solution("...!@BaT#*..y.abcdefghijklm"))
function solution(new_id) {
  let answer = new_id
    .toLowerCase() //step 1
    .replace(/[^0-9a-z._-]/g, "") // step 2
    .replace(/\.+/g, ".") //step 3
    .replace(/^\.|\.$/g, "") //step 4
    .replace(/^$/, "a") //step 5
    .slice(0, 15)
    .replace(/\.$/, ""); //step 6
  // step7
  if (answer.length === 1) answer = answer[0].repeat(3);
  if (answer.length === 2) answer = answer + answer[1];

  return answer;
}

.charAt(index)

-문자열의 index의 값을 가져온다

문제 4

숫자문자열과 영단어

function solution(s) {
    let numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    var answer = s;

    for(let i=0; i< numbers.length; i++) {
        let arr = answer.split(numbers[i]);
        answer = arr.join(i);
    }

    return Number(answer);
}

딱 이문제랑 똑같이 했는데
split 랑 join[i] 가 먼저 몰라서 헤메고 있었다
join() 함수에 특정 구분자('/')를 인자로 넣으면 해당 구분자로 배열의 문자열을 합친다.
이 문장을 이용해서 만든 것 특정 구분자로 합친다.

a= "one4seveneight"
b = a.split('one'); //[ '', '4seveneight' ]
c = b.join(1) //14seveneight
console.log(b,c)
profile
2022.08 개발자 시작

0개의 댓글