문제1 특이한 정렬
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 10,000
- 1 ≤ numlist의 원소 ≤ 10,000
- 1 ≤ numlist의 길이 ≤ 100
- numlist는 중복된 원소를 갖지 않습니다.
입출력 예
numlist | n | result |
[1, 2, 3, 4, 5, 6] | 4 | [4, 5, 3, 6, 2, 1] |
[10000,20,36,47,40,6,10,7000] | 30 | [36, 40, 20, 47, 10, 6, 7000, 10000] |
function solution(numlist, n) {
let distanceArr = [];
for (let i = 0; i < numlist.length; i++) {
let distance = Math.abs(n - numlist[i]);
distanceArr.push([distance, numlist[i]]);
}
distanceArr.sort(function(a, b) {
if (a[0] === b[0]) {
return b[1] - a[1];
} else {
return a[0] - b[0];
}
});
let answer = distanceArr.map(function(pair) {
return pair[1];
});
return answer;
}
`numlist` 배열의 각 원소와 `n`과의 거리를 계산하여 `distanceArr` 배열에 `[거리, 원소]` 형태로 추가합니다.
`distanceArr` 배열을 거리를 기준으로 오름차순으로 정렬합니다. 만약 거리가 같다면 원소의 크기를 기준으로 내림차순으로 정렬합니다.
정렬된 `distanceArr` 배열에서 원소만 추출하여 반환합니다.
문제2 등수 매기기
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ score[0], score[1] ≤ 100
- 1 ≤ score의 길이 ≤ 10
- score의 원소 길이는 2입니다.
- score는 중복된 원소를 갖지 않습니다.
입출력 예
score | result |
[[80, 70], [90, 50], [40, 70], [50, 80]] | [1, 2, 4, 3] |
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] | [4, 4, 6, 2, 2, 1, 7] |
function solution(score) {
const averages = score.map(([english, math]) => (english + math) / 2);
const sortedIndexes = Array.from(Array(score.length), (_, index) => index)
.sort((a, b) => averages[b] - averages[a]);
const ranks = Array(score.length);
let currentRank = 1;
let currentScore = averages[sortedIndexes[0]];
ranks[sortedIndexes[0]] = currentRank;
for (let i = 1; i < score.length; i++) {
if (averages[sortedIndexes[i]] < currentScore) {
currentRank = i + 1;
currentScore = averages[sortedIndexes[i]];
}
ranks[sortedIndexes[i]] = currentRank;
}
return ranks;
}
`averages` 배열을 생성하여 `score`의 각 학생의 평균 점수를 계산합니다.
`sortedIndexes` 배열을 생성하여 평균 점수를 기준으로 내림차순으로 정렬된 인덱스 배열을 생성합니다.
`ranks` 배열을 생성하여 등수를 저장합니다.
`const ranks = Array(score.length);`은 `score` 배열의 길이만큼의 빈 배열을 생성하는 과정입니다.
등수를 계산하여 `ranks` 배열에 저장합니다.
`let currentRank = 1;`은 현재 등수를 나타내는 변수 `currentRank`를 1로 초기화합니다.
`let currentScore = averages[sortedIndexes[0]];`은 현재 점수를 나타내는 변수 `currentScore`를 `averages` 배열의 첫 번째 요소로 초기화합니다.
`ranks[sortedIndexes[0]] = currentRank;`은 정렬된 인덱스 배열 `sortedIndexes`의 첫 번째 요소에 현재 등수를 저장하는 과정입니다.
`for` 문을 사용하여 `averages` 배열을 순회하면서 등수를 계산합니다.
`if (averages[sortedIndexes[i]] < currentScore)`은 현재 점수보다 작은 점수를 만났을 때, 등수를 업데이트하는 조건문입니다.
`currentRank = i + 1;`은 등수를 업데이트합니다.
`currentScore = averages[sortedIndexes[i]];`은 현재 점수를 업데이트합니다.
`ranks[sortedIndexes[i]] = currentRank;`은 현재 학생의 등수를 `ranks` 배열에 저장합니다.
`ranks` 배열을 반환합니다.
문제3 옹알이
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 15
- babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
- 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
- 문자열은 알파벳 소문자로만 이루어져 있습니다.
입출력 예
babbling | result |
["aya", "yee", "u", "maa", "wyeoo"] | 1 |
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]3 |
3 |
function solution(babbling) {
var answer = 0;
const regex = /^(aya|ye|woo|ma)+$/;
babbling.forEach(word => {
if (regex.test(word)) answer++;
})
return answer;
}
변수 `answer`를 0으로 초기화합니다. 이 변수는 발음 가능한 단어의 개수를 저장합니다.
정규식 패턴 `/^(aya|ye|woo|ma)+$/`를 사용합니다. 이 패턴은 'aya', 'ye', 'woo', 'ma' 중 하나의 발음을 1회 이상 반복하는 문자열을 검사합니다.
`babbling` 배열의 각 단어에 대해 반복문을 실행합니다.
정규식 패턴 `regex`를 사용하여 현재 단어를 검사합니다.
만약 정규식 패턴에 매치되는 경우, 즉 발음 가능한 단어일 경우 `answer`를 증가시킵니다.
반복문이 끝나면 최종적으로 `answer` 값을 반환합니다.
문제4 옹알이
머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.
- 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
- 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.
제한사항
- 회원들의 아이디는 문자열입니다.
- 회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.
- 회원들의 패스워드는 숫자로 구성된 문자열입니다.
- 회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.
- id_pw의 길이는 2입니다.
- id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.
- 1 ≤ 아이디의 길이 ≤ 15
- 1 ≤ 비밀번호의 길이 ≤ 6
- 1 ≤ db의 길이 ≤ 10
- db의 원소의 길이는 2입니다.
입출력 예
id_pw | db | result |
["meosseugi", "1234"] | [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] | "login" |
["programmer01", "15789"] | [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] | "wrong pw" |
function solution(id_pw, db) {
var answer = '';
let inputId = id_pw[0];
let inputPw = id_pw[1];
var found = false;
for (let i = 0; i < db.length; i++) {
let member = db[i];
let memberId = member[0];
let memberPw = member[1];
if (inputId === memberId && inputPw === memberPw) {
answer = 'login';
found = true;
break;
}
// 아이디는 일치하지만 비밀번호가 일치하지 않는 회원 정보를 찾은 경우
if (inputId === memberId && inputPw !== memberPw) {
answer = 'wrong pw';
found = true;
break;
}
}
// 회원 정보를 찾지 못한 경우
if (!found) {
answer = 'fail';
}
return answer;
}
먼저, 주어진 `id_pw` 배열에서 아이디와 비밀번호를 추출합니다.
그 다음, `db` 배열을 순회하면서 각 회원 정보를 검사합니다.
회원 정보와 입력한 아이디 및 비밀번호를 비교하여 세 가지 경우를 처리합니다.
아이디와 비밀번호가 모두 일치하는 회원 정보를 찾은 경우: 로그인 성공으로 간주하여 `answer` 변수를 `'login'`으로 설정하고 반복문을 종료합니다.
아이디는 일치하지만 비밀번호가 일치하지 않는 회원 정보를 찾은 경우: 비밀번호가 잘못된 것으로 간주하여 `answer` 변수를 `'wrong pw'`로 설정하고 반복문을 종료합니다.
회원 정보를 모두 검사한 후에도 일치하는 회원 정보를 찾지 못한 경우: 로그인 실패로 간주하여 `answer` 변수를 `'fail'`로 설정합니다.
최종적으로 `answer` 변수를 반환하여 로그인 성공, 실패에 따른 메시지를 출력합니다.