머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 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입니다.
db.forEach(x => {
if (x[0] == id_pw[0] && x[1] == id_pw[1]) {
return "login"
} else if (x[0] == id_pw[0] && x[1] != id_pw[1]) {
return "wrong pw"
} else {
return "fail"
}
})
forEach()
를 돌려 db 배열 안의 요소마다 각각 로그인, 비번 정보를 체크하여 상황에 따라 "login", "wrong pw", "fail"을 반환하려고 했으나,forEach()
문은 루프를 조기에 종료하고 값을 반환하는 기능을 제공하지 않기 때문에 위와 같은 코드로는 제대로 실행이 되지 않고 undefined를 반환했다.let result = [];
for (const x of db) {
if (x[0] == id_pw[0] && x[1] == id_pw[1]) {
result.push("login");
} else if (x[0] == id_pw[0] && x[1] != id_pw[1]) {
result.push("wrong pw");
} else {
result.push("fail");
}
}
if (result.includes("login")) {
return "login"
} else if (result.includes("wrong pw")) {
return "wrong pw"
} else {
return "fail"
}
result
라는 새로운 배열을 만든 뒤, forEach()
대신 for()
반복문을 사용하여 각기 다른 상황에 따라 맞는 값을 result
에 push
하여 result
배열에 값이 담기도록 했음.result
안에 해당 값이 존재하는지 includes
를 통해 일일이 확인시켜 반환하도록 함🥲 근데 좀 비효율적인 코드인 것 같다. 짜면서도 시간효율성은 하나도 따지지 않은 게 나도 느껴져서 민망...
다른 사람의 풀이 참고
const [id, pw] = id_pw;
const map = new Map(db);
return map.has(id) ? (map.get(id) === pw ? 'login' : 'wrong pw') : 'fail';
id_pw
배열 속 요소를 id
와 pw
로 따로 담아 관리!
Map()
라는 맵 객체를 사용했음
자바스크립트 맵 객체(Map Object) :
JavaScript에서 Map은 키-값(key-value) 쌍을 저장하는 데이터 구조입니다. Map 객체는 키와 값 사이의 매핑을 유지하며, 순서가 있는 데이터 집합을 나타냅니다. 각 키는 유일해야 하며, 동일한 키를 가진 여러 개의 값이 존재할 수 있습니다.
const myMap = new Map();
// 요소 추가
myMap.set("key1", "value1");
myMap.set("key2", "value2");
myMap.set("key3", "value3");
// 요소 접근
console.log(myMap.get("key1")); // 출력: "value1"
// 크기 확인
console.log(myMap.size); // 출력: 3
// 요소 반복
for (const [key, value] of myMap) {
console.log(key, value);
}
```
조건부 삼항연산자를 두번 사용하여 id
와 pw
값에 대한 확인을 각각 진행
이번 문제를 통해 주목해야할 것은
Map 객체
forEach()
는 루프 중간에 멈추고 값을 반환하는 것이 불가