오늘한것
1. 알고리즘 challenge 문제풀기 (프로그래머스) (29 ~ 36)
2. 자바스크립트 혼공스 스터디 배정
3. 잘 안풀렸던 이전 문제 2개 해결
오늘은 자바스크립트 스터디반이 오전에 새로 배정되고, 조도 갑자기 재편성 되었던날.
알고리즘 문제도 나름 잘 해내고 있다고 생각한다.
오늘 몇가지 풀기 까다로웠던 문제와 사용했던 방법들을 복기해보고자 한다.
자바스크립트에서 진법 변환
n = 3
let three = n.toString(3) // 10진수 3이 3진수로 변환
// 3진수에서 10진수로 변환
// parseInt안의 매개변수 3이 원래 n이 가진 진수가 몇진수인지를 설정
let answer = parseInt(n, 3)
최소직사각형 문제
https://school.programmers.co.kr/learn/courses/30/lessons/86491
function solution(sizes) {
var answer = 0;
let maxArr = [];
let minArr = [];
//배열안의 두 값을 비교해서 큰값은 0번 인덱스로, 작은값은 1번인덱스로 자리를 바꿔준다.
for (let i = 0; i < sizes.length; i++) {
if (sizes[i][0] < sizes[i][1]) {
sizes[i] = sizes[i].reverse();
}
}
//최대값끼리(0번 인덱스끼리), 최솟값끼리(1번 인덱스끼리) 배열 만들기
for (let i = 0; i < sizes.length; i++) {
maxArr.push(sizes[i][0]);
minArr.push(sizes[i][1]);
}
console.log(maxArr, minArr);
// 0번 인덱스의 최댓값 과 최솟값의 곱
// min, max 함수는 각각 () 안에 나열된 수를 비교하는 것이기 때문에 배열 그대로 넣으면 오류, 전개연산자를 이용하여 객체나 배열의 원소들을 하나씩 꺼내어서 펼쳐서 리턴시켜야 한다.
answer = Math.max(...maxArr) * Math.max(...minArr);
return answer;
}
이때 Math.max를 사용할때 배열을 그냥 집어넣었더니 안됐고, 찾아보니 그냥 쉼표로 나열된 수를 넣어줘야했다.
쉽게 할 수 있는 방법이 없나 찾아보던도중 전개연산자를 알게 되었고, 배열의 원소들을 하나씩 꺼내서 넘겨주기 때문에 적용할 수 있다는 것을 알게 되었다.
https://school.programmers.co.kr/learn/courses/30/lessons/77484
function solution(lottos, win_nums) {
// 포함하지 않는값
let arr1 = lottos.filter((x) => !win_nums.includes(x));
// 중복값 == 맞춘 최소 숫자
let arr2 = lottos.filter((x) => win_nums.includes(x));
// lottos에 포함된 0의 갯수
let zero = lottos.filter((x) => x === 0);
// 3가지 예외 경우
if (zero.length == 6) {
// lottos에 0이 6개면 1 or 6등이므로
return [1, 6];
} else if (arr2.length == 6) {
// lottos를 전부 다 맞추면 1등만이므로
return [1, 1];
} else if (arr1.length == 6) {
// lottos를 전부 다 틀릴 경우
return [6, 6];
} else {
// 두 경우 다 아니라면 arr2의 갯수와 zero의 갯수로 최고, 최저 순위를 구할 수 있다.
return [7 - arr2.length - zero.length, 7 - arr2.length];
}
}
이것은 if문으로 예외를 만들어 처리하는것이 2개의 예외는 test에 나오는데 lottos를 전부 다 틀릴경우는 나오지 않았다. 지금보니 그렇게 생각하는게 어렵지 않은것처럼 보이는데 ㅎㅎ 그 당시에는 조금 까다로웠던것 같다. 문제도 읽고 싶지않게 길기 때문에 괜히 어려워보이기도했는데, 막상 풀어보니 그렇게 어렵지는 않은듯..?
문자열 내 마음대로 정렬하기
https://school.programmers.co.kr/learn/courses/30/lessons/12915
사실 이문제는 sort 함수를 이용해서 하면 분명 풀릴것 같은데 내부에 조건문을 제대로 못써서 고민하다가 답을 확인하였다.
function solution(strings, n) {
let answer = strings.sort((a, b) => {
// n번째 인덱스끼리 비교하여 a[n]이 크면 1을 반환하여 a와 b의 자리를 바꾼다.
if (a[n] > b[n]) return 1;
// n번째 인덱스끼리 비교하여 b[n]이 크면 -1을 반환하여 a와 b의 자리를 바꾸지 않는다.
if (a[n] < b[n]) return -1;
// n번째 인덱스끼리 비교했을때 두값이 같다면 a와 b를 비교
if (a[n] === b[n]) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
});
return answer;
}
참고:
잘한점
- reduce, fliter, sort같은 메소드들은 어느정도 익숙해진듯하다.
- 문제를 풀며 기록을 잘 해뒀기 때문에 TIL 작성시간 감소
다음 목표 및 개선해야할점
- 내일 자바스크립트 스터디 준비
- 챌린지 문제 끝내기
- 못푼문제, 애매했던 문제 복기
- react 주특기 전 추천영상 시청