TIL 37 (2020.09.08) JS

jeanbaek·2020년 9월 8일
0

TIL (Today I Learned)

목록 보기
37/106

오늘 익힌 메소드

  • Map 객체 (new Map() 생성자는 Map 객체를 생성한다.)
    : 키-값 쌍을 저장하며 각 쌍의 삽입 순서를 기억하는 콜렉션이다.
    filter 혹은 forEach와 같은 구문이며, 반복적인 일을 할 때 사용한다.
    이 블로그에 잘 정리되어 있어서 까먹었을 때 참고하면 좋을 듯 하다.

    • 주의할 점은, 반드시 return 값을 받아야 값이 나오며, return을 입력하지 않으면 undefined로 출력될 수 있다는 점이다.
  • .set()
    : 중복되는 값을 가지지 않는 값들의 리스트이다. 값의 순서가 없기 때문에 인덱스를 가지지 않는다.

  • .indexOf()
    : (array) 배열에서 지정된 요소가 위치하는 첫번째 인덱스를 반환한다. (배열에 지정된 요소가 존재하지 않으면, -1을 반환한다.)
    : (string) 호출한 String 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환한다. (일치하는 값이 없으면, -1을 반환한다.)

    • .lastIndesOf()
      : 배열에서 지정된 요소가 위치하는 마지막 인덱스를 반환한다.
  • .innerFunction().innerFunction2()
    : 내장함수 여러개를 붙일때는 이처럼 닫음괄호뒤에 점을 붙여 이어주면 된다.

  • .count()
    : console.count() 형식으로 콘솔을 붙여서만 쓸 수 있는 듯 하다.
    count한 값을 별도로 return하고 싶었는데, 아직 방법을 잘 모르겠다.

  • .sort()
    : 배열을 순서대로 정렬해준다.
    단, string 전용 메소드이기 때문에, 숫자 오름차 순 정렬이 필요할 시 별도의 추가 입력이 필요하다.

//숫자 오름차 순 위한 추가 입력

(function(a, b) {
    return a - b;
});

또한, 어느 위치에서 .sort()를 입력하건, 코드 전역에 영향을 준다. (즉, 모든 곳에서 해당 배열 순서를 정렬한다.)

  • .includes()
    : 배열이 특정 요소를 포함하고 있는지 판별한다.
const pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false
  • var a = prompt() 를 통해 입력받은 문자를 .split()으로 나눴을 때,
    typeof(a)를 콘솔에 로그하면, object라고 나타난다.
    나는 배열 형태로 저장되었을 거라고 생각했는데 아니었다!

  • parseInt()
    : 첫번째 인자만 문자열에서 숫자열로 바꿔주기 때문에, 배열 전체의 타입을 바꿔주지 않는다.

확실히 어제 꼼꼼히 복습을 하고 나니, 오늘은 문제 풀 때 이런저런 메소드가 잘 생각났다.
위코드가 개강한 후에 더 잘 기억날 수 있도록 미리 더 익혀놔야겠다.

추가 문제

  • 무작위로 세 자리 수를 공백으로 구분지어 입력할 때, 오름차순이면 YES를, 내림차순이면 NO를 출력하는 문제

사실 이 문제는 끝까지 못 풀어서 결국 답안을 봤다...
나는 if (parseInt(a[i]) === parseInt(c[i])) 이런 식으로 parseInt를 써서
동일한 인덱스의 숫자값이 같은지 다른지를 기준으로 검사를 하려고 했다.

또한, a.sort((x, y) => (x - y));처럼 a.sort를 하니까
코드 전역에 있는 모든 a가 오름차순으로 정렬이 되어버렸다.
따라서 if 문을 돌려도 모든 숫자가 다 똑같을 수밖에 없었다.
(수정* sorted=unsorted.sort도 같은 내용인데, 왜 unsorted가 정렬되지 않았을까?? )

일단 답은 아래와 같다.

const unsorted = prompt('키를 입력하세요');
let sorted = "";

sorted = unsorted
  .split(" ")
  .sort(function(a, b) {
    return a - b;
  })
  .join(" ");

if (unsorted === sorted) {
  console.log("Yes");
} else {
  console.log("No");
}

답은 parseInt를 쓰고 있지 않다.
다만 sorted와 unsorted가 같은 포맷일 때, 내용이 같은지 다른지만 보고 있다.

휴... 못풀어서 너무 아쉽지만 1시간 반동안 붙잡고 있었으니 내 나름대로 최선을 다했다고 보고 넘어가려 한다.

  • 반장선거를 할 때, 이름이 가장 여러 번 적힌 사람의 '이름과 수'를 출력하세요.

입력: '원범 원범 혜원 혜원 혜원 혜원 유진 유진'
출력: 혜원(이)가 총 4표로 반장이 되었습니다.

const vote = '원범 원범 혜원 혜원 혜원 혜원 유진 유진'.split(' ');
// {'이름': 투표수} 형식으로 딕셔너리 생성
let counts = {};
for (let i=0; i<vote.length; i++) {
  let num = vote[i];
  // ? 앞은 if 조건 / ? 뒤는 if 실행 / : 뒤는 else 실행
  counts[num] = counts[num] ? counts[num] + 1 : 1;
}

// value 값만 추출해서 정렬
const countsValue = Object.values(counts); countsValue.sort();
const theBiggestValue = countsValue[countsValue.length-1] // 4
let elected = "" // 혜원

for (let key in counts) {
  if (theBiggestValue === counts[key]) {
    elected += key
  }
}

console.log(`${elected}(이)가 총 ${theBiggestValue}표로 반장이 되었습니다.`)

와우... 한 시간 동안 매달려서 끝내 풀었다.

  • 1~3위 학생 중 중복되는 학생까지 포함하여 상으로 사탕을 줄 예정.
    학생들의 점수를 공백으로 구분하여 입력을 받고, 사탕을 받을 학생의 수를 출력하세요. ()

입력: 97 86 75 66 55 97 85 97 97 95
출력: 6

const score = '97 86 75 66 55 97 85 97 97 95'
  .split(' ')
  .sort((x, y) => (y - x));

const score2 = new Set(score); // 우선 중복 없애기
const arrayed = [...score2]; // Set을 배열화 하기
const highscore = arrayed.slice(0, 3); // 1~3등 점수만 추출
let howMany = 0;

for (let i=0; i<score.length; i++) {
  if (score[i] >= highscore[highscore.length-1]) {
    howMany += 1
  }
}

console.log(howMany);

와우 이것도 한 시간이 걸렸다.
가장 시간을 잡아먹은 이유는 내가 뭔가 기억은 나는데 확실하게 기억나지 않아서 이것저것 시도해보며 아주 작은 오류들을 내기 때문이었다.

그래도 예전보다 문제를 풀어가는데 끈기가 생긴 것 같아 좋았다.

  • 문장이 입력되면 모든 q를 e로 바꾸는 프로그램을 작성해 주세요.
const wrongSent = prompt('q가 포함된 문장을 작성해주세요');
console.log(wrongSent.replaceAll('q', 'e'));
  • 놀이공원이다. 제한 무게를 넘으면 다음 기구를 타야한다. 한 기구에 친구들 총 몇 명이 탈 수 있는 지 알려주는 프로그램을 작성해주세요.

입력
50 // 제한무게
5 // 친구 수 (n)
20 // 몸무게 (무작위)
20
20
20
20

출력
2

.....................

체력적으로 힘드니까 머리를 쓰지 않고 몸빵을 하려고 하게 된다...
이 문제는 솔직히 어떻게 접근해야하는지, 출제자의 의도가 뭔지조차 유추하기가 어렵다.

내일 답을 보고 더 배우는 편이 나을 것 같다.

오늘은 여기까지.

profile
💡 Software Engineer - F.E

0개의 댓글