고양이와 코딩
[프로그래머스] 10월 22일 ~ 본문
10월 22일
문제1
내 코드
function solution(score) {
var answer = [];
for (var i=0; i < score.length; i++){
var avg = (score[i][0] + score[i][1]) / 2
answer.push(avg)
}
const sortedAnswer = [...answer].sort((a,b) => b - a);
const rank = answer.map(value => sortedAnswer.indexOf(value) + 1);
return rank;
}
헤맸던것 !!!
→ 내림차순으로 정렬 한 뒤 순위를 매기는 부분에서 "기존 배열에서 순위" 를 매기는 부분을 헤맸다.
기존 배열인 answer를 기반으로 순위를 생성하는 코드를 짰다!
1. 각 배열의 평균을 계산
2. 평균값을 내림차순으로 정렬
3. 원래 배열의 각 요소에 대한 순위 계산
10월 23일
문제 1
오답
function solution(babbling) {
const words = ["aya", "ye", "woo", "ma"];
let answer = 0;
for (let i = 0; i < babbling.length; i++) {
let current = babbling[i];
for (let j = 0; j < words.length; j++) {
while (current.includes(words[j])) {
// 해당 발음을 제거
current = current.replace(words[j], '');
}
}
if (current.length === 0 ) {
// 모든 발음을 조합하여 문자열을 만들 수 있으면
answer++;
}
}
return answer;
}
처음에 코드를 이렇게 넣어줬더니 첫 번째 테스트 케이스에서 오류가 발생했다.
오류를 따라가보니 "wyeoo"에서 for문을 돌며 먼저 "ye"를 공백으로 치환하면 "woo"가 남아서 또 word에 포함되기 때문이다!!
★그래서 공백 대신 다른 문자로 치환해 주고 ('-') for문을 빠져나와서 '-'로 치환 해 준 문자열을 다시 공백으로 바꿔 준 뒤
길이가 0인 경우 (모든 발음이 조합된 경우) answer을 증가시켜 준다.
최종 코드
function solution(babbling) {
const words = ["aya", "ye", "woo", "ma"];
let answer = 0;
for (let i = 0; i < babbling.length; i++) {
let current = babbling[i];
for (let j = 0; j < words.length; j++) {
while (current.includes(words[j])) {
// 해당 발음을 제거
current = current.replace(words[j], '-');
}
}
current = current.replace(/-/g, "");
if (current.length === 0) {
// 모든 발음을 조합하여 문자열을 만들 수 있으면
answer++;
}
}
return answer;
}
문제 2
코드
function solution(id_pw, db) {
var answer = '';
for (let i = 0; i < db.length; i++) {
const array = db[i]
for (let j = 0; j < array.length; j++){
if(id_pw[0] == array[0] && id_pw[1] == array[1]){
return "login";
} else if(id_pw[0] == array[0] && id_pw[1] != array[1]){
return "wrong pw";
}
}
}
return "fail";
}
주의해야 할 점은 "fail"을 출력하는 return 문을 이중 반복문 밖으로 옮겨야 한다는 것이다.
반복문 안에 있으면 첫 번째 요소에서 아이디가 다르면 바로 fail이 출력되기 때문!
그리 효율적인 코드는 아니여서 다른 사람들의 코드도 보았다.
function solution(id_pw, db) {
const [id, pw] = id_pw;
const map = new Map(db);
return map.has(id) ? (map.get(id) === pw ? 'login' : 'wrong pw') : 'fail';
}
db배열을 기반으로 한 Map객체를 생성한다!! 여기서 Map객체는 아이디를 키로, 패스워드를 값으로 매핑
map.has(id) : map 객체에서 입력된 아이디 'id'가 존재하는지 확인하고,존재하면 true를 존재하지 않으면 false를 반환한다.
map.get(id) : map 객체에서 입력된 아이디 'id'에 대해 저장된 패스워드를 가져온다
map.get(id) === pw ? 'login' : 'wrong pw' 가져온 패스워드와 입력된 패스워드를 비교 후 일치하면 login 반환, 불일치하면 wrong pw 반환.
mmap.has(id)가 false인 경우 fail반환
난 아직 멀어따.....
10월 24일
문제 1
내 코드
function solution(chicken) {
var coupon = chicken;
var service_chicken = 0;
while (coupon >= 10) {
service_chicken += Math.floor(coupon / 10);
coupon = Math.floor(coupon / 10) + coupon % 10;
}
return service_chicken;
}
처음에는 left_coupon이랑 chicken의 수도 다 변수로 만들어서 이상하게 관리를 했는데
곰곰히 생각해보니 그럴필요가 없다는걸 알았다..
coupon의 수가 10개 이상일때까지 while문을 반복하고 서비스 치킨의 수를 정수만 포함해서 coupon / 10한 결과를 계속 더해주고,
coupon의 수를 구하고 + left_coupon역할을 하는 남은 쿠폰도 coupon % 10으로 따로 더해준다.
어렵진 않은데 머리가 빙빙 도는 문제!! 합리적으로 생각하기
10월 25일
문제 1
내 코드
function solution(bin1, bin2) {
var bin1 = parseInt(bin1, 2);
var bin2 = parseInt(bin2, 2);
var temp = bin1 + bin2;
const answer = temp.toString(2);
return answer;
}
2진수 상태에서 더하려는 생각을 잠깐 했지만.. 2진수 -> 10진수 변환 후 덧셈
그리고 다시 10진수 -> 2진수 변환을 하면 간단하다.
내 코드가 깔끔하진 않지만 ㅎㅎ
문제 2
틀린 코드
function solution(i, j, k) {
let count = 0;
for (x = i; x <= j; x++) {
if(String(x).includes(String(k))) {
count++
}
}
return count;
}
처음 제출한 코드는 몇몇 테스트케이스를 통과하지 못했는데, 11처럼 1이 두 번 들어가는 경우(k가 중복되는 경우)
에 대한 처리를 해주지 않아서이다. 그런데 includes는 문자열이 포함되어 있는지만을 확인하는거라 중복을 체크할 수 없다.
그래서 정규표현식을 사용해서 문제를 다시 풀었당
function solution(i, j, k) {
let count = 0;
for (x = i; x <= j; x++) {
const string_x = String(x);
const regex = new RegExp(k, 'g');
const matches = string_x.match(regex);
if (matches) {
count += matches.length;
}
}
return count;
}
정규표현식 객체인 regex를 생성해서 g플래그로 전역 검색을 활성화하고, k를 모두 찾을 수 있게 한다.
match메서드를 사용하여 string_x문자열에서 regex패턴과 일치하는 모든 부분 문자열을 찾아서 matches에 저장한다!
if (matches) matches 배열이 비어있지 않은 경우!! == 일치하는 부분 문자열이 존재하는 경우
matches 배열의 길이를 count에 추가한다 ~
'javascript' 카테고리의 다른 글
[프로그래머스] 10월31일 ~ 11월6일 (0) | 2023.10.31 |
---|---|
[프로그래머스] 10월 27일 ~ 10월 30일 (1) | 2023.10.27 |
[JavaScript] 제로부터 시작하는 자바스크립트(2) (1) | 2023.03.19 |
[JavaScript] 제로부터 시작하는 자바스크립트(1) (0) | 2023.03.19 |
[JavaScript] 나를 당황하게 한 직각삼각형 출력하기 (0) | 2023.02.03 |