[코딩 테스트 연습 입문] 로그인 성공?
문제
머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 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입니다.
입출력 예
입출력 예 설명
입출력 예 #1
- db에 같은 정보의 계정이 있으므로 "login"을 return합니다.
입출력 예 #2
- db에 아이디는 같지만 패스워드가 다른 계정이 있으므로 "wrong pw"를 return합니다.
입출력 예 #3
- db에 아이디가 맞는 계정이 없으므로 "fail"을 return합니다.
✔풀이
def solution(id_pw, db):
if id_pw in db:
return "login"
else:
for db_id_pw in db:
if id_pw[0]==db_id_pw[0]:
return "wrong pw"
return "fail"
📝설명
경우는 문제에서 설명하다시피 3가지이다.
id_pw가 db 안에 존재한다면 "login", 아이디만 같다면 "wrong fail", 아예 같은 게 없다면 "fail"을 리턴한다..
id_pw가 db안에 존재하는 경우에 대한 걸 if문을 통해 먼저 다뤘다.
그렇다면 남는 경우는 어떻게 처리할까?
아이디가 db에 있는지 없는지만 확인하면 된다.
왜냐하면, 실제로 db에 id가 존재하는 경우는 pw가 같은 경우와 다른 경우로 총 2가지로 나누어지지만!
if문에서 이미 같은 경우를 다뤘기 때문에 이번엔 id의 일치 여부만 확인하면 된다.
따라서, db안에 있는 배열을 하나씩 꺼내어 비교하기 위해서 for문에 집어넣었다.
그 후 id_pw의 id부분과 꺼내어진 1차원 배열의 아이디와 비교하여 같으면 " wrong pw"를 리턴하도록 했다.
나머지의 경우는 "fail"이 리턴되도록 코드를 짰다.
👑모범 답안
🔎딕셔너리에서 .get()을 사용하면 괄호 안에 있는 부분의 value를 호출해올 수 있다고 한다.
if문을 뜯어서 생각해보면, 우선 db를 딕셔너리로 변환한 후, key가 id_pw[0] (=id 부분)과 같은 게 있으면 해당 key를 가진 db의 value(db의 pw 부분)를 db_pw에 저장했다.
만약 아이디가 같은 부분이 없다면 곧장 "fail"로 return된다.
db_pw가 저장됐다면, 이 db_pw와 id_pw의 pw부분을 비교한다.
둘이 같다면 아이디와 비밀번호 모두 일치한 것이므로 "login"을, 그렇지 않은 경우에는 "wrong pw"을 return하도록 한다.
👀느낀 점
: 딕셔너리의 get에 대해서 처음 알게 되었다.
2차원 배열은 항상 어렵게 느껴져서 접근하기가 까다롭다고 생각했는데, 딕셔너리로 바꾸고 get을 사용하면 보다 쉽게 문제를 해결할 수 있을 것 같다는 근자감이 든다..^^
💻 문제 출처