코드 그라데이션

[Lv.0] 로그인 성공? 본문

Java/알고리즘

[Lv.0] 로그인 성공?

완벽한 장면 2023. 6. 10. 22:01

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

 

프로그래머스

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

programmers.co.kr

8점짜리 문제!

 

문제 설명

머쓱이는 프로그래머스에 로그인하려고 합니다. 

머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 

다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

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

3) 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

 

제한사항

 

입출력 예

 

입출력 예 설명

 

아이디어

<경우의 수> 

1) 아이디 == 비밀번호 => login
2) 아이디 x => fail
3) 아이디 o, 비밀번호 x => wrongpw

 

  • 아이디가 아예 없는지, 아이디가 있는데 비밀번호가 다른지를 구분해야 한다.
  • 단순히 로그인이 되었냐 안되었냐의 문제가 아니다.

db에는 행에 id와 pw 세트가 있고,

열은 첫번째 열에는 id 고 두 번째 열이 pw이다.

 

 

초기 코드

class Solution {
  public String solution(String[] id_pw, String[][] db) {
    String answer = "";
    for (int i=0; i<db.length; i++) {
      for (int j=0; j<db[i].length; j++) {
        if (db[i].equals(id_pw[0])) {
          return "fail";
        }
        else if (db[j].equals(id_pw[1])) {
          return "wrong_pw";
        }
      }
    }
    return answer;
  }
}

지금 여기서 보면 db[i]는 아이디만을 의미하는 게 아니라, id+pw 다 있으니까 id만을 의미하려면 대괄호 하나 더 필요하고,

id는 언제나 0번이고, pw는 언제나 1번임을 의미.

 

그리고 2차원 배열이 나왔다고 해서 반드시 중첩 for문을 써야 하는 건 아니다.

지금 안 쓰고 있는 j 부분의 for문은 그냥 날려도 됨.

id나 pw는 언제나 0번이나 1으로 정해져 있으니까.

 

고민해야 할 부분, 주어진 3가지 경우의 수 중에 찾자마자 이거 틀려 할 수 있는 경우나, 이거 맞아 할 수 있는 경우가 무엇일까를 생각해보자.

=> login이다.

그럼 위에서 로그인부터 먼저 체크하면 된다.

=> 조건을 id 같은지 && 비밀번호 같은지 // 이렇게 두 개를 다 따져줘야 하고,

반대로, 아이디는 같으나 비밀번호만 다른 경우는 wrong_pw가 될 것이다.

비밀번호가 틀린 상황도, 내 비밀번호가 틀리면 끝ㄴ이지 내 비밀번호를 가지고 다른 사람의 비밀번호와 일치하는지 확인하는게 말이 안되니까.

wrong_pw를 바로 리턴 가능하게 됨.

 

나의 답안

class Solution {
    public String solution(String[] id_pw, String[][] db) {
        for(int i=0; i<db.length; i++) {
            if(db[i][0].equals(id_pw[0]) && db[i][1].equals(id_pw[1])) {
                return "login";
            }
            else if(db[i][0].equals(id_pw[0]) && !db[i][1].equals(id_pw[1])) {
                return "wrong pw";
            }
        }
        return "fail";
    }
}

 불완전한 코드(else-if로 분기가 끝나는)라서 리펙터링

 

공통 부분이 있으므로 그걸 if문으로 분리.

class Solution {
    public String solution(String[] id_pw, String[][] db) {
        for (int i = 0; i < db.length; i++) {
            if (db[i][0].equals(id_pw[0])) {
                if (db[i][1].equals(id_pw[1])) {
                    return "login";
                } else {
                    return "wrong pw";
                }
            }
        }
        return "fail";
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
Comments