<로직 고민>
- 일단 db를 for문에 돌려서 id_pw가 일치하는 값이 있는지, id만 일치하는지, pw만 일치하는지 조건문을 걸어보자~
def solution(id_pw, db):
for data in db:
if id_pw[0] == data[0] and id_pw[1] == data[1]:
answer = "login"
elif id_pw[0] == data[0] and id_pw[1] != data[1]:
answer = "wrong pw"
elif id_pw[0] != data[0] and id_pw[1] == data[1]:
answer = "fail"
return answer
- 처음에 이렇게 짰는데 3가지 입출력 예시에 대한 실행은 잘 됐다
- 근데 채점하니까 케이스 1번을 통과하지 못했다
- 코드를 쓰면서 db에 아이디도, 비밀번호도 맞는 게 없다면 어떻게 하지? 라는 생각은 했지만 그거에 대한 얘기는 없어서 저렇게 썼다
- 3번째 예시가 비밀번호는 맞는데 아이디가 틀려서 실패한 거니까 그렇게 조건을 걸어주면 되겠지 했는데 문제가 의도한 건 그게 아니라 비밀번호가 맞든 틀리든 아이디가 틀리면 무조건 fail을 보내라는 거였나보다
elif id_pw[0] != data[0]:
- if문 3번째를 위처럼 수정하고 다시 채점했다
- 근데 또 1번 케이스 통과를 못 했다..
- 도대체 1번 테스트가 뭐길래.....
- 아이디 틀리면 무조건 fail인 거 아닌가 후
- 생각해보니까....db에서 데이터를 하나씩 꺼낼 때 로그인할 아이디가 아니면 answer에 fail이 들어가는 건데 로그인 정보가 db 앞부분에 있어서 answer에 login이 들어갔다가 다음 데이터가 돌 때는 아이디가 일치하지 않아서 fail이 answer에 담기게 된다 그래서 틀린거군...!!!
- 그렇다고 맞는 정보를 찾자마자 return하기엔 맞는 정보는 뒤쪽에 있는데 첫 번째 데이터가 돌 때 입력한 값과 맞지 않는다고 fail을 바로 리턴하면 또 틀린 답이 되는거고
- 그래서 fail은 for문을 돌든 말든 기본값으로 fail을 리턴하게끔 하고 맞는 정보가 있을 경우에만 login이든 wrong pw든 리턴하면 된다..!!!
<완성된 코드>
def solution(id_pw, db):
for data in db:
if id_pw[0] == data[0] and id_pw[1] == data[1]:
return "login"
elif id_pw[0] == data[0] and id_pw[1] != data[1]:
return "wrong pw"
return "fail"
<다른 사람 풀이>
- 천재풀이1
def solution(id_pw, db):
if db_pw := dict(db).get(id_pw[0]):
return "login" if db_pw == id_pw[1] else "wrong pw"
return "fail"
- := 연산자는 파이썬 3.8부터 도입된 새로운 연산자다 일명 바다코끼리라고 부른다
- 저게 없었다면
def solution(id_pw, db):
db_pw = dict(db).get(id_pw[0])
if db_pw:
return "login" if db_pw == id_pw[1] else "wrong pw"
return "fail"
- 이렇게 써야 하는데 :=을 씀으로써 두 줄을 한 줄로 바꿀 수 있었다
dict(db).get(id_pw[0])
- 이 부분은 현재 리스트인 db를 딕셔너리로 변환해서 get함수를 쓰고 있다
- 입력값의 아이디부분(key값)이 딕셔너리에 내에 있다면 db_pw에는 비밀번호 부분(value값)이 담기고 if문을 통과한다
return "login" if db_pw == id_pw[1] else "wrong pw"
- 이 줄은 현재 db_pw는 db에 있는 값 중 id_pw의 아이디부분과 일치하는 값의 비밀번호 부분이 담겨있다 둘을 비교해서 일치하면 아이디와 비밀번호가 일치한다는 뜻이므로 login을 리턴하고 비밀번호가 일치하지 않는다면 wrong pw를 리턴한다
- if문에 해당하지 않으면 fail을 리턴한다