[프로그래머스] "로그인 성공?": JS -forEach() 대신 Map객체 사용

신혜린·2023년 7월 17일
0

알고리즘(javascript)

목록 보기
15/21
post-thumbnail

문제 설명

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 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()반복문을 사용하여 각기 다른 상황에 따라 맞는 값을 resultpush하여 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 배열 속 요소를 idpw로 따로 담아 관리!

  • 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);
    }
    		```
  • 조건부 삼항연산자를 두번 사용하여 idpw 값에 대한 확인을 각각 진행



이번 문제를 통해 주목해야할 것은

  • Map 객체
  • forEach()는 루프 중간에 멈추고 값을 반환하는 것이 불가
profile
개 발자국 🐾

0개의 댓글