개발일지

개발일지 25일차

index.ys 2023. 4. 11. 01:44

프로그래머스 코딩테스트 연습문제 풀기

내적

내가 쓴 풀이

- for문을 사용하여 배열 a의 인덱스 i값과 배열 b의 인덱스 i값을 곱한 값을 answer 값에 더하는 식을 짰다.

function solution(a, b) {
    let answer = 0;

    for (let i = 0; i < a.length; i++) {
        answer += a[i] * b[i];
    }

    return answer;
}

for문을 대체할 함수로 map메서드를 사용해 다른식도 작성했다.

function solution1(a, b) {
    return a.map((e, i) => e * b[i]).reduce((a, b) => a + b, 0)
}

a배열에 map메서드를 사용해 각각의 요소 e에 b의 인덱스값을 곱하여 새로운 배열을 만들고 그 배열을 reduce메서드로 다 더해주었다. reduce메서드는 초기값을 설정해 주지 않으면 오류가 난다는 사실을 오늘 알았기때문에 초기값을 0으로 설정해주었다.

문자열 다루기 기본

내가 쓴 풀이

- if문을 사용해 문자열 s의 length가 4 혹은 6일때를 만족하는 식, 문자열 s를 숫자열로 변환한 식과 정수로 변환한 식이 같을때를 true로 리턴하고 그렇지 않은 경우를 false로 리턴했다.

function solution(s) {
    if ((s.length === 4 || s.length === 6) && (Number(s)) === (parseInt(s))) {

        return true
        // return Number.isInteger(Number(s)); //true
    } else {
        return false;
    }
}

if문을 삼항연산자로 좀 더 줄여서 식을 작성해보았다.

function solution1(s) {
    return (s.length === 4 || s.length === 6) && (Number(s)) === (parseInt(s)) ? true : false
}

서울에서 김서방찾기

내가 쓴 풀이

- 배열 seuol을 돌면서 "Kim"이라는 문자열의 인덱스 값을 x라는 변수에 넣고 x값을 템플릿 리터럴을 사용해 `김서방은 ${x}에 있다` 를 리턴했다.

function solution(seoul) {
  //배열 seoul을 돌면서 "kim"의 인덱스 위치찾기
  let x = seoul.indexOf("Kim");

  //x를 "김서방은 ${x}에 있다"
  return `김서방은 ${x}에 있다`;
}

indexOf 메서드는 특정 문자열의 위치, 인덱스값을 반환해주는 메서드이다

수박수박수박수박

내가 쓴 풀이

- 반복문 for를 사용하여 0부터 n - 1까지 반복하는 반복문에 조건문으로 i값이 짝수가 아닐때  문자열 "박"을 빈 문자열 answer에 추가하고 i값이 짝수 일때 문자열 "수"를 answer에 추가하는 식을 만들었다.

function solution(n) {
  let answer = "";
  for (let i = 0; i < n; i++) {
    if (i % 2 !== 0) {
      answer += "박";
    } else {
      answer += "수";
    }
  }

  return answer;
}

repeat메서드를 사용해 n번만큼 "수박" 을 반복하고 slice메서드를 사용해 반복된 문자열의 0번째 문자열부터 n번째 문자열까지만 반환한다.

function solution1(n) {
    return "수박".repeat(n).slice(0, n); //수박수
}

- slice("시작위치", "종료위치") 또는 slice("시작위치") 시작위치부터 종료위치 -1 까지의 문자열을 잘라내 잘라낸 문자열을 반환한다.

- substring("시작위치", "종료위치")  시작위치부터 종료위치 -1 까지 인덱스에 해당하는 문자열을 잘라내어 반환한다.

- substr("시작위치","길이") 또는 ("시작위치") 해당되는 문자열의 길이까지 문자를 잘라내 잘라낸 문자열을 반환한다. "길이" 부분을 생략하면 시작위치부터 문자열 끝까지 자른다.

문자열 내림차순으로 배치하기

내가 쓴 풀이

- split 메서드를 이용해 문자열 s를 배열로 만듬 - sort 메서드를 이용해 문자열을 오름차순으로 정렬함 - reverse 메서드를 이용해 오름차순으로 정렬된 배열을 내림차순으로 정렬함.- 내림차순으로 정렬된 배열을 문자열로 합침.

function solution(s) {
  return s.split("").sort().reverse().join("");
}

완주하지 못한 선수

내가 쓴 풀이

- 조원분들의 도움을 받아 빈 객체를 생성하여 객체를 활용한 방법으로 문제를 풀었다. 하지만 아직 이해가 완벽하게 되지 않아서 개인적인 풀이로 더 풀어봐야한다고 생각했다.

function solution(participant, completion) {
  answer = "";
  // 1. object 생성
  let obj = {};
  // 2. participant의 이름들을 key, 그 이름이 나오는 횟수를 value로 object에 추가
  participant.forEach((ele) => {
    if (obj[ele] === undefined) obj[ele] = 1;
    else obj[ele] += 1;
  });
  // { mislav: 2, stanko: 1, ana: 1 }
  // 3. object에서 completion의 요소에 해당하는 key값의 value를 하나 감소
  completion.forEach((e) => {
    obj[e]--;
  });

  for (let i in obj) {
    if (obj[i] === 1) {
      answer += i;
    }
  }
  return answer;
}

같은 숫자는 싫어

내가 쓴 풀이

- 배열 arr의 길이만큼 순회하는 for 반복문을 사용해 arr[i]인덱스에 해당하는 배열의 값과 그 배열의 전 값 arr[i-  1]을 비교하여 해당 값과 전값이 같지 않을때 arr[i]인덱스에 해당하는 값을 newArr에 push로 넣는 식을짰다.

function solution(arr) {
    let newArr = []

    for (let i = 0; i < arr.length; i++) {
        if (arr[i] !== arr[i - 1]) {
            newArr.push(arr[i])
        }

    }

    return newArr;
}

오랜만에 혼자서 막힘없이 풀었던 문제이다 아직까지 for반복문이 조금이라도 변형되면 헷갈려하는것 같아서 for 반복문을 활용하는 식들을 많이 풀어봐야겠다.

이상한 문자 만들기

내가 쓴 풀이

function solution(s) {
  //"try hello world"
  answer = "";
  let arr = s.split(" "); //[ 'try', 'hello', 'world' ]

  //짝수번째 알파벳은 대문자, 홀수번째 알파벳은 소문자
  //
  for (let i = 0; i < arr.length; i++) {
    //첫번재 단어를 제외한 이후부터 스페이스바
    if (i !== 0) {
      answer += " ";
    }

    for (let j = 0; j < arr[i].length; j++) {
      //
      if (j % 2 === 0) {
        answer += arr[i][j].toUpperCase();
      } else {
        answer += arr[i][j].toLowerCase();
      }
    }
  }

  // console.log(`(${answer})`);

  //문자열의 인덱스에 따라 대문자 혹은 소문자로 판별하는식  0은 대문자 1은 소문자 짝수 홀수

  //
  return answer;
}

- 조원분들의 도움으로 풀긴했으나 중첩반복문에 대한 이해도가 아직 높지않아서 복습해야한다.

자릿수 더하기

내가 쓴 풀이

- 숫자열 n을 인자로 받고 변수 answer을 0으로 초기화 한다. 반복문 i는 0부터 문자열로 변환한 n의 길이만큼 돌면서 n을 문자열로 변환한다. 변환한 문자열을 문자열 인덱스의 값을 숫자열로 변환하고 변환한 숫자열을 변수 answer에 하나씩 더하는 식을짯다.

function solution(n) {
	let answer = 0;
  	for (let i = 0; i < String(n).length; i++) {
    //"1" "2" "3"
    answer += Number(String(n)[i]);
    
  }
  return answer
}

map메서드를 이용한 다른식

- 숫자 n을 문자로 변환하고 배열로 만든다음 배열요소를 하나씩 도는 메서드인 map 메서드를 이용하여 요소하나하나를 돌면서 문자열을 숫자열로 바꿔준다음 reduce 메서드를 사용해  a에 값이 하나씩 누적 되게 하는 식을 만들었따.

  function solution(n) {
   let answer = String(n) // ["1", "2", "3"]
     .split("")
    .map((e) => Number(e))
     .reduce((a, b) => a + b, 0); // 0+"1" => "01"
   return answer;

느낀점: 아직 for문의 i값을 잘 이해하지 못한다는 생각이 들었고 중첩반복문 또한 헷갈린다고 느낀다 map, filter , reduce, forEach같은 배열을 반복하는 단골 메서드들의 간단한 사용법은 알고 있지만 조금더 디테일한 부분들이 아직 헷갈리고 머리속에서 정리가 되지 않은것 같다고 느껴서 일단 for문을 사용해 알고리즘 문제를 풀면서 for문을 계속 이해하고, 그 다음에 반복메서드들을 사용하여 문제를 풀면서 for문과 반복메서드들의 이해를 높혀야 겠다는 생각이들었다.