저장을 습관화

프로그래머스 LV.0 로그인 성공? 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 로그인 성공?

ctrs 2023. 10. 7. 18:42

프로그래머스 LV.0 로그인 성공?

https://school.programmers.co.kr/learn/courses/30/lessons/120883

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

로그인 성공?


2. 문제 설명

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.


3. 제한 사항

- 회원들의 아이디는 문자열입니다.
- 회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.
- 회원들의 패스워드는 숫자로 구성된 문자열입니다.
- 회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.
- id_pw의 길이는 2입니다.
- id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.
- 1 ≤ 아이디의 길이 ≤ 15
- 1 ≤ 비밀번호의 길이 ≤ 6
- 1 ≤ db의 길이 ≤ 10
- db의 원소의 길이는 2입니다.


4. 예시

id_pw db result
["meosseugi", "1234"] [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] "login"
["programmer01", "15789"] [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] "wrong pw"
["rabbit04", "98761"] [["jaja11", "98761"], ["krong0313", "29440"], ["rabbit00", "111333"]] "fail"


5. 기본 제공 코드

function solution(id_pw, db) {
    var answer = '';
    return answer;
}


6. 제출한 내 답

const solution = (id_pw, db) => {

  for (i = 0; i < db.length; i++) {
    if (db[i][0] === id_pw[0] && db[i][1] === id_pw[1]) {
      return "login";
    } else if (db[i][0] === id_pw[0] && db[i][1] !== id_pw[1]) {
      return "wrong pw";
    }
  }
  return "fail";
};
정확성  테스트
테스트 1 〉	통과 (0.05ms, 33MB)
테스트 2 〉	통과 (0.04ms, 33.5MB)
테스트 3 〉	통과 (0.05ms, 33.1MB)
테스트 4 〉	통과 (0.05ms, 33.4MB)
테스트 5 〉	통과 (0.05ms, 33.4MB)
테스트 6 〉	통과 (0.04ms, 33.5MB)
테스트 7 〉	통과 (0.04ms, 33.5MB)
테스트 8 〉	통과 (0.04ms, 33.6MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

 

6-2. VSC에 작성한 내용

const solution = (id_pw, db) => {
  // 아이디 패스워드가 모두 일치하면 "login"
  // 아이디가 일치하지 않다면 "fail",
  // 아이디가 일치하지만 패스워드가 일치하지 않다면 "wrong pw"

  for (i = 0; i < db.length; i++) {
    if (db[i][0] === id_pw[0] && db[i][1] === id_pw[1]) {
      return "login";
    } else if (db[i][0] === id_pw[0] && db[i][1] !== id_pw[1]) {
      return "wrong pw";
    }
  }
  return "fail";
};

// 테스트
console.log(
  solution(
    ["meosseugi", "1234"],
    [
      ["rardss", "123"],
      ["yyoom", "1234"],
      ["meosseugi", "1234"],
    ]
  )
);
console.log(
  solution(
    ["programmer01", "15789"],
    [
      ["programmer02", "111111"],
      ["programmer00", "134"],
      ["programmer01", "1145"],
    ]
  )
);
console.log(
  solution(
    ["rabbit04", "98761"],
    [
      ["jaja11", "98761"],
      ["krong0313", "29440"],
      ["rabbit00", "111333"],
    ]
  )
);


7. 특이사항

사실 이 풀이법도 정확히 따져보면 틀려야 맞는거다

만약 DB 배열안에 id는 일치하나 pw가 일치하지 않는 요소가 먼저 나오고,

id와 pw가 일치하는 요소가 그 다음에 나온다면 result는 "login"이 되어야 하나

내 풀이법대로하면 "worng pw"가 나올 것이다.

 

틀릴것을 예상하고 채점을 우선 돌려봤으나 통과되었다.


8. 다른 사람이 작성한 답

8-1. 가장 많이 쓰인 풀이법, 좋아요를 가장 많이 받은 풀이법, Map 객체 생성하는 함수

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';
}

 

8-2.

function solution(id_pw, db) {
    db = db.filter(v=>v[0]===id_pw[0]);

    if (!db.length) return 'fail';

    for (let d of db) if (d[1] === id_pw[1]) return 'login';

    return 'wrong pw';
}