일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- fabricjs
- REACT
- 코딩 국비지원
- 프로젝트마무리
- FLASK
- 엘리스
- 블로그와 친해지기
- tempfile
- Python
- 코딩국비지원
- 와탭랩스
- reactStrictMode
- 엘리스AI트랙데모데이
- 개발자 채용설명회
- 웹개발포트폴리오
- aws_s3
- 부트캠프프로젝트발표
- 코딩교육
- 프레임워크vs라이브러리
- 코딩배우기
- 이미지처리프로젝트
- 팀프로젝트
- 엘리스AI트랙
- 인공지능모델학습
- pymupdf
- 웹개발프로젝트
- after_this_request
- devmode
- 엘리스 AI 트랙
- 코딩부트캠프
- Today
- Total
자몽이 조아
[프로그래머스]주사위게임3 본문
https://school.programmers.co.kr/learn/courses/30/lessons/181916
function solution(a, b, c, d) {
var answer = 0;
//1. 일단 작은 순으로 정렬한다.(오름차순)
const [q,w,e,r] = [a,b,c,d].sort((x,y)=>x-y)
//2. 값이 모두 같을 때
if(q==r){
answer = q * 1111;
}else if(q==e){//3개가 같을때
answer = (10*q+r) * (10*q+r)
}else if(w==r){//3개가 같을때
answer = (10*r + q) * (10*r + q)
}
else if(q==w && e==r){//2개 2개 같을 때
answer = (q+e)*(e-q)
}
else if(q==w){//2개가 같고 나머진 다를 때
answer = e*r
}
else if(e==r){//2개가 같고 나머진 다를 때
answer = q*w
}
else if(w==e){
answer = q*r
}
else{//다 다를떄
answer = q
}
return answer;
}
반례가 중요했는데, 오름차순으로 정렬 하고,
작은수부터 비교하고, 큰수부터 비교하는 조건으로 하다가
가운데의 값이 같은 경우를 놓쳤었다.
다른 사람의 답 분석
function count(arr) {
const counter = new Map();
for (const num of arr) {
counter.set(num, (counter.get(num) || 0) + 1);
}
const sortedByCnt = [...counter.keys()].sort((a, b) => counter.get(b) - counter.get(a));
const maxCnt = Math.max(...counter.values());
return [sortedByCnt, maxCnt];
}
function solution(a, b, c, d) {
const [arr, maxCnt] = count([a, b, c, d]);
const [p, q, r, s] = arr;
if (arr.length === 1) {
return p * 1111;
}
if (arr.length === 2) {
return maxCnt === 2 ? (p + q) * Math.abs(p - q) : (10 * p + q) ** 2;
}
if (arr.length === 3) {
return q * r;
}
return Math.min(p, q, r, s);
}
count라는 함수를 정의했다.
일단 Map 을 쓴게 인상깊었다. 나는 잘 쓸 줄 모르는데 여기서 잘 배워가야겠다.
counter라는 변수에 Map 객체를 할당
카운터에 num을 키값으로 쓰고,
숫자가 없다면 즉 중복되지 않는다면 1이되고, 중복이 되면 counter +1을 넣어준다.
숫자별로 몇개가 존재하는 지를 확인하는 것 같다.
그 다음, 카운터의 키값만 배열로 만들어서 내림차순으로 정렬한 배열을 sortedByCnt에 할당
그리고 카운터의 값, 즉 반복된 횟수의 최대값을 maxCnt라는 곳에 할당한다.
그리고 키값 내림차순배열과 반복횟수최대값을 리턴해준다.
solution함수
abcd의 값을 통해서 우선 내림차순배열과 반복횟수최대값을 받는다.
p,q,r,s 각각에 순서대로 숫자를 할당한다.
여기서 처음 본 문법으로,
[p,q,r,s]=arr라고 했을때, 꼭 arr의 길이가 4가 아니어도 된다는 것을 처음 봤다.
그리고 arr의 길이에 따라서 중복된 숫자의 횟수를 확인한다.
1이면 모두 같은것이고,
arr 길이가 2인 경우 maxCnt가 2인경우. 즉 반복되는 수가 2개이면서 최대 반복횟수가 2인 경우와
아닌경우. 즉 반복되는 수는 2개인데 maxCnt가 3인 경우
arr의 길이가 3인경우, 즉 2개가 중복되고 나머지 2개는 다른 수인경우
그리고 가장작은 수
다른사람 글 분석2
function solution(a, b, c, d) {
const map = new Map();
for (const data of [a, b, c, d]) {
map.set(data, (map.get(data) || 0) + 1);
}
const sortedArr = [...map].sort((a, b) => {if (a[1] === b[1]) return b[0] - a[0]; else return b[1] - a[1]});
if (map.size === 1) return 1111 * sortedArr[0][0];
else if (map.size === 3) return sortedArr[1][0] * sortedArr[2][0];
else if (map.size === 4) return sortedArr[3][0];
else if (sortedArr[0][1] === 3) return (10 * sortedArr[0][0] + sortedArr[1][0]) ** 2;
else return (sortedArr[0][0] + sortedArr[1][0]) * (sortedArr[0][0] - sortedArr[1][0]);
}
이것도 비슷한 거 같다.
set으로 만들어서, 반복횟수 값으로 넣어주고
그런데 map객체를 sort했다. 이게 가능한지는 몰랐다.
map.size가 1 즉 모두 같은 경우
3 즉 2개만 같은 경우
4 즉 모두 다른 경우
3개의 숫자가 같은 경우
나머지 2쌍인경우
이 문제의 핵심은 중복 제거를 통해서 조건을 줄일 수 있다는 것 같다.
궁금해진 점.
map과 set의 차이
https://velog.io/@parkcode/JavaScript-set%EA%B3%BC-map
그리고 object와의 차이
'알고리즘 코테준비' 카테고리의 다른 글
[프로그래머스]정수를 나선형으로 배치하기 (1) | 2025.02.12 |
---|---|
[프로그래머스] 게임 맵 최단거리 - BFS (0) | 2022.05.19 |
최단경로 찾기 (0) | 2022.01.19 |
다이나믹 프로그래밍 (0) | 2022.01.13 |