상근이는 퀴즈쇼의 PD이다. 이 퀴즈쇼의 참가자는 총 8개 문제를 푼다. 참가자는 각 문제를 풀고, 그 문제를 풀었을 때 얻는 점수는 문제를 풀기 시작한 시간부터 경과한 시간과 난이도로 결정한다. 문제를 풀지 못한 경우에는 0점을 받는다. 참가자의 총 점수는 가장 높은 점수 5개의 합이다.
상근이는 잠시 여자친구와 전화 통화를 하느라 참가자의 점수를 계산하지 않고 있었다. 참가자의 8개 문제 점수가 주어졌을 때, 총 점수를 구하는 프로그램을 작성하시오.
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n").map(item=>item.replace('\r',""));
let num_list = [];
//입력받은 값을 문제번호와 점수값을 가지고 있는 obj로서 배열에 저장
for(let i = 0;i<input.length;i++){
num_list.push(new Number(i+1,parseInt(input[i])))
}
//객체값중 점수에해당 하는 값을 정렬
num_list.sort(function (a,b){
if (a.num > b.num) return -1;
else if(a.num < b.num) return 1;
else return 0;
})
//객체 생성 함수
function Number(idx,num){
this.idx = idx;
this.num = num;
}
let result = [];
let total = 0;
//최고 점수5개를 추린 후 총 점수를 구함
for(let i = 0; i<5;i++){
result.push(num_list[i].idx);
total += num_list[i].num;
}
//정답 출력
console.log(total);
console.log(result.sort().join(" "));
결과
위 문제를 고민하면서 가장큰 걸림돌은 문제의 번호를 기억할 변수가 필요했다는 것이다.
쉽게보면 점수를 내림차순으로 정렬한뒤 앞에서부터 5문제를 짜르면되는데
문제는 해당 문제가 몇번쨰인지 정렬을하면서 뒤섞인다는 점이다.
그래서 생각했던 것이 key:value 형태로서 저장해서 value로 정렬하고 출력할땐 key값으로 출력하는 형태를 생각했다.
그러다 구현이 쉬운 객체로 문제를 풀게되었다.
1. index번호 +1(=문제번호) 와 입력받은 점수를 통하여 객체로서 num_list 라는 배열에 저장한다.
2. num_list에 접근하여 점수를 기준으로 정렬하는 sort()를 작성한다.
3. 이후 정렬되어 있는 배열에서 0~4번째 인덱스를 다른 배열에 옮긴다.
4. 해당 배열을 정렬하여 문제번호가 오름차순으로 출력될수 있도록 한다.
문제를 공략한 방법은 위와 같다.
key:value 형태로 데이터를 저장하는 법을 알고 그것을 value와 key를 기준으로 정렬하는 법을 안다면 쉽게 풀 수 있는 문제였던거 같다.
위 문제는 처음에 문제 이해를 잘못해서 풀이방향이 잘못될뻔한 문제이다..종이를 넘기는것이 입력받은 값기준 첫번째 줄이 두번째줄에게 종이를 넘기는 것이므로 예제 1번에서 N은 아래로 두번째 있는 아이가 쓴것이라고 이해했다.근데 왜인지 위로 두번째를 넘겼어야했다. 이건 아직도 잘모르겠지만..위로 하니까 풀렸다(예제출력을 보고 알았다)
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
//입력받은값들을 배열로서 저장
let words = [];
for(let i = 0; i < input.length; i++){
words.push(input[i].trim());
}
let result = 0;
for(let i = 1; i < words.length; i++){
//받은 문자를 배열화
let check = [...words[i]];
let linked = true;
//이중배열을 통해 이어서 같은 알파벳이 나오면 same true 유지
//다른 알파벳이 나오면 false로 전환
//이후 다시 같은 알파벳이 나오면 linked를 false로 변경하여 링크단어가 아님을 표시
for(let j = 0; j < check.length;j++){
let same = true;
for(let k = j+1; k < check.length; k++){
if(check[j] != check[k]){
same = false;
}
if(!same){
if(check[j] == check[k]){
linked = false;
}
}
}
}
if(linked){
result++;
}
}
console.log(result);
결과
이 문제를 처음 봤을떄 문자를 배열화하여 이중배열로 확인하면 금방 풀리겠다 라고 생각했다.
처음의 생각했던 방식은 아래와 같다.
happy 라는 입력값이 있을경우 이를 배열화 하여
[ 'h', 'a', 'p', 'p', 'y'] 로 변환하고 이중배열을 통하여 이어지는 알파벳들을 검사한다.
i번째 인덱스가 h일때 j번째 인덱스는 appy를 검사하고
i번째 인덱스가 a일때 j번째 인덱스는 ppy를 검사한다.
이때 same 이라는 boolean 값을 하나 만들어 반복문이 실행될때 이 값을 true로 두고
i번째 인덱스값과 j번째 인덱스가 달라질경우 해당 값을 false로 변경한다.
이떄 same값이 false 일때부터 i번째 인덱스와 j번째 인덱스가 같을경우 linked 값을 false로 변경하여 링크단어가 아님을 표시한다.
마지막으로 반복문이 끝날때 linked 값이 true이면 result 값에 1을 더하고 아닐경우 그냥 패스한다.