Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- Python
- Lv. 0
- SQL
- 소프티어
- level 3
- Baekjoon
- programmers
- dfs
- LEVEL 2
- 깊이 우선 탐색
- SQL 고득점 KIT
- join
- Lv. 2
- Lv. 3
- 프로그래머스
- Dynamic Programming
- javascript
- 오블완
- Lv. 1
- group by
- 티스토리챌린지
- DP
- Java
- 너비 우선 탐색
- 파이썬
- bfs
- 자바스크립트
- 백준
- softeer
- 동적계획법
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
Softeer [Level 3] [한양대 HCPC 2023] Hanyang Popularity Exceeding Competition {언어 : JavaScript} [2025.02.10 수정] 본문
알고리즘/풀었지만 다시 보기
Softeer [Level 3] [한양대 HCPC 2023] Hanyang Popularity Exceeding Competition {언어 : JavaScript} [2025.02.10 수정]
스위태니 2024. 10. 21. 20:23728x90
문제 링크
https://softeer.ai/practice/9495
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
정답 코드
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const inputData = [];
rl.on('line', (line) => {
inputData.push(line.split(" ").map((e) => Number(e)));
}).on('close', () => {
const n = inputData[0];
const celebrities = inputData.slice(1);
// dp를 2차원 배열로 생각할 것
const dp = Array.from({length: n}, () => [0, 0]);
// dp[0]은 방문 했을 때, dp[1]은 현재 지점을 방문하지 않았을 때,
dp[0][0] = celebrities[0][0] <= celebrities[0][1] ? 1 : 0;
for (let i = 1; i < n; i++) {
const [pi, ci] = celebrities[i];
// 현재 철민이의 인기도
const [xi0, xi1] = dp[i-1];
const xni0 = Math.abs(pi-xi0) <= ci ? xi0+1 : xi0;
const xni1 = Math.abs(pi-xi1) <= ci ? xi1+1 : xi1;
dp[i][0] = Math.max(xni0, xni1);
dp[i][1] = Math.max(xi0, xi1);
}
console.log(Math.max(...dp[n-1]));
process.exit(0);
});
풀이 방법
- 동적계획법을 사용할 예정이다.
- dp를 2차원 배열로 만들고 dp[i]의 0번째 인덱스는 방문한 경우, 1번째 인덱스는 방문하지 않은 경우로 나눈다.
- dp[1]을 먼저 설정해준다.
- 처음 인기도는 0이므로 인기도가 첫 번째 유명인의 인기도와 친화력에 달려있다.
- dp[i]는 다음과 같다.
- 이전의 dp[i-1]에서 celebritys[i-1] 즉, i-1 번째 유명인을 방문 했을 때와 방문하지 않았을 때의 인기도가 현재의 인기도가 된다.
- 현재의 인기도 xi0와 xi1로 현재 유명인을 만났을 때 오르는지 각각 구하고 최대값을 dp[i][0]에 치환한다.
- dp[i][1]은 현재 유명인을 만나지 않을 것이므로 xi0와 xi1 중 큰 값으로 치환한다.
- 마지막으로 dp[n-1]중 최대값을 출력하면 끝!
느낀점 [이 코드도 정답]
아직 동적계획법에 대해 잘 모르는 경우 다음과 같은 실수를 할 수 있다.
더보기
const answer = celebrities.reduce((x, [pi, ci]) => {
if (Math.abs(pi-x) <= ci) {
return x+1;
}
return x;
}, 0);
console.log(answer);
그냥 배열만 보고 계속해서 더해 나가면 되는거 아닌가? 하는 실수이다.이렇게 해도 테스트케이스 1, 2, 3을 맞출 수 있지만 이대로 제출하면 바로 틀린다.따라서 경우의 수를 모두 생각하고 문제를 풀어야 한다.또한 문제 안의 힌트를 찾는 것 또한 중요하다.힌트는유명인을 건너 뛸 수 있다.유명인을 마주해도 인기도가 오르지 않을 수 있다.
이 힌트를 보고 모두 방문 하지 않고 건너 뛰는 방법을 구상해야 한다.
수정 내용 2025.02.10
- 코드가 너무 간단해서 실수라고 생각했으나 제출해보니 정답이었다.
- 댓글을 작성해주신 "bjw"님이 아니었다면 정답인줄 몰랐을 것 같다.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const inputData = [];
rl.on('line', (line) => {
inputData.push(line.split(" ").map((e) => Number(e)));
}).on('close', () => {
const n = inputData[0];
const celebrities = inputData.slice(1);
const answer = celebrities.reduce((x, [pi, ci]) => {
if (Math.abs(pi-x) <= ci) {
return x+1;
}
return x;
}, 0);
console.log(answer);
process.exit(0);
});
728x90
'알고리즘 > 풀었지만 다시 보기' 카테고리의 다른 글
Softeer [Level 3] 수퍼바이러스 {언어 : JavaScript} [BigInt] (2) | 2024.10.29 |
---|---|
Softeer [Level 3] [HSAT 2회 정기 코딩 인증평가 기출] Garage game {언어 : JavaScript} (4) | 2024.10.23 |
Softeer [Level 3] [한양대 HCPC 2023] Phi Squared {언어 : JavaScript} (2) | 2024.10.21 |
프로그래머스 [Lv. 2] 도넛과 막대 그래프 {언어 : JavaScript} [반례 포함] (0) | 2024.10.14 |
백준 SILVER 1 [11052번] 카드 구매하기 {언어 : Python} (0) | 2024.10.10 |