코딩항해기

[프로그래머스] 로그인 성공? 문제 (JAVA, Python) 본문

problem solving/코딩 테스트

[프로그래머스] 로그인 성공? 문제 (JAVA, Python)

miniBcake 2024. 11. 23. 17:21

 

 

JAVA

package test;

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

    public static void main(String[] args) {
        //확인용
        String[] id = {"test", "123"};
        String[] id2 = {"rardss", "123"};
        String[] id3 = {"rardss", "1234"};
        String[][] db = {{"rardss", "123"}, {"yyoom", "1234"}, {"meosseugi", "1234"}};
        System.out.println("fail : "+solution(id, db)); //fail
        System.out.println("login : "+solution(id2, db)); //login
        System.out.println("wrong pw : "+solution(id3, db)); //wrong pw
    }

    public static String solution(String[] id_pw, String[][] db) {
        //msg
        final String ID_FAIL = "fail"; //아이디 불일치
        final String PW_FAIL = "wrong pw"; //비밀번호 불일치
        final String LOGIN_SUCCESS = "login"; //성공 시

        //들어온 배열의 0번(아이디)가 db데이터의 중 0번(아이디)와 일치하는 경우가 있나?
            //있다면 해당 데이터의 1번(비밀번호)와 일치하나?
                //일치한다면 로그인 성공문구 반환
            //일치하지 않는다면 비밀번호 불일치 문구 반환
        //db를 다 확인했는데도 없다면 아이디 불일치 문구 반환

        for(String[] data : db){ //DB에서
            //아이디가 일치하는 경우가 있는지
            if(data[0].equals(id_pw[0])){
                System.out.println("id check success");
                //일치한다면 비밀번호 확인
                if(data[1].equals(id_pw[1])){
                    //비밀번호가 일치한다면
                    System.out.println("pw check success");
                    return LOGIN_SUCCESS;
                }
                //비밀번호가 일치하지 않는다면
                System.out.println("pw check fail");
                return PW_FAIL;
            }
        }
        //일치하는 경우가 없다면
        return ID_FAIL;
    }
}

 

 

Python

def solution(id_pw, db):
    #msg
    ID_FAIL = 'fail'
    PW_FAIL = 'wrong pw'
    LOGIN_SUCCESS = 'login'

    #들어온 배열의 아이디와 일치하는 아이디가 있는지 확인
        #있다면 비밀번호 일치 확인
            #일치하면 로그인
        #일치하지 않는다면 비밀번호 불일치
    #없다면 아이디 불일치

    for data in db:
        #아이디가 일치하는지 확인
        if data[0] == id_pw[0]:
            print('id check success')
            #아이디 일치할 경우 pw 일치 확인
            if data[1] == id_pw[1]:
                #pw일치
                print('pw check success')
                return LOGIN_SUCCESS
            #비밀번호 불일치
            print('pw check fail')
            return PW_FAIL
    #아이디 불일치
    return ID_FAIL



db = [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]]
id = ["test", "123"]
id2 = ["rardss", "123"]
id3 = ["rardss", "1234"]
print("fail : "+solution(id, db)) #fail
print("login : "+solution(id2, db)) #login
print("wrong pw : "+solution(id3, db)) #wrong pw

 

풀이를 보니 파이썬 3.8에서 할당과 비교를 같이할 수 있는 기능(:=)이 추가되어 해당 기능을 적용한 코드를 보게 되었다.

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"

 

확실히 파이썬은 for문을 사용하지 않고 구현할 수 있는 방법이 많은 것 같다. 딕셔너리, 자바에서는 Map을 활용하면 좋을 것 같다는 생각을 풀면서 하긴 했는데 이렇게까지 효과적일줄은 몰랐다.

 

해당 코드는 db리스트를 딕셔너리로 변환해 일치하는 데이터를 쉽게 찾아와 db_pw에 비밀번호를 할당하면서 조건문에서 사용한다. 이후 비밀번호를 비교해 알맞은 문구를 출력한다.

(아이디가 있으면 pw를 반환하기 때문에 True, 아니라면 None을 반환해 False가 되는 구조)