코딩테스트 23일차
특이한 정렬
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
function solution(numlist, n) {
var distanceArray = [];
// 거리와 해당 원소를 쌍으로 가지는 배열 생성
for (var i = 0; i < numlist.length; i++) {
var distance = Math.abs(n - numlist[i]);
distanceArray.push([distance, numlist[i]]);
}
// 거리를 기준으로 오름차순 정렬, 거리가 같다면 원소의 크기를 기준으로 내림차순 정렬
distanceArray.sort(function (a, b) {
if (a[0] === b[0]) {
return b[1] - a[1];
}
return a[0] - b[0];
});
var answer = [];
// 정렬된 배열에서 numlist의 원소만 추출하여 answer 배열에 추가
for (var j = 0; j < distanceArray.length; j++) {
answer.push(distanceArray[j][1]);
}
return answer;
}
✏️풀이
numlist의 각 원소와 n의 차이를 계산합니다. (절댓값을 사용하여 거리를 구합니다.)
계산된 거리와 해당 원소를 쌍으로 가지는 배열을 생성합니다.
배열을 거리 순으로 오름차순 정렬합니다. 거리가 같다면 해당 원소의 크기를 기준으로 내림차순 정렬합니다.
정렬된 배열에서 각 원소의 두 번째 값 (numlist의 원소)만 추출하여 answer 배열에 추가합니다.
등수 매기기
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.
function solution(score) {
var answer = [];
var ranks = [];
// 각 학생의 평균 점수와 인덱스를 쌍으로 가지는 배열 생성
for (var i = 0; i < score.length; i++) {
var average = (score[i][0] + score[i][1]) / 2;
ranks.push([average, i]);
}
// 평균 점수를 기준으로 내림차순으로 정렬
ranks.sort(function (a, b) {
return b[0] - a[0];
});
// 등수를 매겨 등수 배열에 기록
var currentRank = 1;
for (var j = 0; j < ranks.length; j++) {
var studentIndex = ranks[j][1];
answer[studentIndex] = currentRank;
if (j < ranks.length - 1 && ranks[j][0] !== ranks[j + 1][0]) {
currentRank = j + 2;
}
}
return answer;
}
✏️풀이
빈 배열 answer를 생성합니다.
각 학생의 평균 점수와 등수를 기록할 배열 ranks를 생성합니다.
주어진 score 배열을 순회하면서 각 학생의 영어 점수와 수학 점수의 평균을 계산하여 ranks 배열에 평균 점수와 학생의 인덱스를 쌍으로 추가합니다.
ranks 배열을 평균 점수를 기준으로 내림차순으로 정렬합니다.
ranks 배열을 순회하면서 각 학생의 등수를 매겨서 answer 배열에 등수를 기록합니다. 등수는 현재 등수를 나타내는 변수 currentRank를 사용하여 업데이트합니다. 동일한 평균 점수를 가진 학생은 같은 등수를 부여합니다.
answer 배열을 반환합니다.
옹알이 (1)
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(babbling) {
var answer = 0;
const regex = /^(aya|ye|woo|ma)+$/;
babbling.forEach(word => {
if (regex.test(word)) answer++;
})
return answer;
}
✏️풀이
answer 변수를 0으로 초기화합니다. 이 변수는 유효한 단어의 개수를 세기 위해 사용됩니다.
정규표현식 regex를 정의합니다. 이 정규표현식은 문자열이 "aya", "ye", "woo", "ma" 중 하나의 단어로 이루어져 있는지를 검사합니다. ^는 문자열의 시작을 의미하며, (aya|ye|woo|ma)는 "aya", "ye", "woo", "ma" 중 하나의 패턴을 의미합니다. +는 해당 패턴이 하나 이상 반복되는 것을 의미하며, $는 문자열의 끝을 의미합니다.
babbling 배열을 순회하면서 각 단어를 검사합니다. forEach 메서드를 사용하여 배열의 각 요소에 대해 반복합니다.
각 단어에 대해 정규표현식 regex를 사용하여 검사합니다. test 메서드를 사용하여 정규표현식과 단어를 비교하고, 매칭되면 조건문이 실행됩니다.
조건문 내부에서 answer 변수를 증가시킵니다. 이는 유효한 단어를 발견했을 때만 카운트하기 위한 것입니다.
반복이 끝나면 최종적으로 answer 값을 반환합니다. 이 값은 유효한 단어의 개수입니다.
로그인 성공?
머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.
function solution(id_pw, db) {
var answer = '';
for (var i = 0; i < db.length; i++) {
var user = db[i];
if (user[0] === id_pw[0]) { // 아이디 일치 여부 확인
if (user[1] === id_pw[1]) { // 패스워드 일치 여부 확인
answer = "login";
break;
} else {
answer = "wrong pw";
}
} else {
answer = "fail";
}
}
return answer;
}
✏️풀이
변수 id에 입력된 아이디를 저장하고, 변수 pw에 입력된 비밀번호를 저장합니다.
변수 loginSuccess를 false로 초기화합니다. 이 변수는 로그인 성공 여부를 나타냅니다.
DB의 각 회원 정보를 반복하여 검사합니다.
회원 정보에서 아이디와 비밀번호를 가져온 후, 입력된 아이디와 비교합니다.
만약 아이디가 일치한다면, 비밀번호를 비교하여 일치하면 loginSuccess를 true로 설정하고 반복문을 종료합니다.
아이디가 일치하고 비밀번호가 불일치할 경우 "wrong pw"를 answer에 저장합니다.
반복문이 종료된 후 loginSuccess가 true인 경우 "login"을 answer에 저장합니다.
answer가 여전히 빈 문자열인 경우 "fail"을 answer에 저장합니다.
answer를 반환합니다.