Algorithms/프로그래머스

[프로그래머스] '로그인 성공?' - Java

LEFT 2023. 7. 13. 14:13

<문제 제시>

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

<예시 입출력>


<문제 해결 과정>

웹개발이나 실제 홈페이지에서 쓰일 듯한 로그인 시스템은 아니더라도 간접적으로 데이터가 어떻게 담기는지 알 수 있는 문제일 것 같았다.

Try 1) 

String answer = "";
        
for(int i = 0; i < db.length; i++) {
    String id = db[i][0];
    String pw = db[i][1];

    if(id_pw[0].equals(id)) {
        // 아이디 / 패스워드 모두 일치 = 로그인 성공
        if(id_pw[1].equals(pw)) {
            answer = "login";
        }
        // 패스워드 실패
        else answer = "wrong pw";
    }

    // 아이디 / 패스워드 모두 실패 
    else answer = "fail";
}
return answer;

테스트케이스 1에서 예외가 발생하여 오답이었다.
생각하기로는 앞선 2차원 배열 인덱스에서는 성공이었으나 뒤에서는 wrong pw나 fail이 발생하였어도
조건문에 해당하지 않아 answer값이 바뀌지 않았을 것 같았다.

코드를 바꿔 answer값을 조건문 안에서 주지않고 조건문에 해당하면 count값을 증가시키고
그 count값에 해당하는 문자열을 입력해주어야할 것 같았다.

Try 2)

String answer = "";
        
int count = 0;
for(int i = 0; i < db.length; i++) {
    count = 0;
    String id = db[i][0];
    String pw = db[i][1];

    if(id_pw[0].equals(id)) {
        // 아이디 / 패스워드 모두 일치 = 로그인 성공
        if(id_pw[1].equals(pw)) {
            return answer = "login";
        }
        // 패스워드 실패
        else count = 1;
    }

    // 아이디 / 패스워드 모두 실패 
    else count = 2;
}


if(count == 1) answer = "wrong pw";
else if(count == 2) answer = "fail";

return answer;

이번에도 여전히 테스트케이스1에서 통과하지 못하였다.

Solution 1)

순위를 매기거나, 값 2개를 따로 처리할때 적합한 맵구조를 이용하기로하였다.

Map<String, String> dbMap = new HashMap<String, String>();

for (String[] strings : db) {
    dbMap.put(strings[0], strings[1]);
}

if (dbMap.containsKey(id_pw[0])) {
    if (dbMap.get(id_pw[0]).equals(id_pw[1])) {
        return answer = "login";
    } else {
        return answer = "wrong pw";
    }
} else {
    return answer = "fail";
}

HashMap을 이용하여 string, string 형태로 입력받고
향상된 for문으로 반복입력받으며 get함수와 containsKey로 조건문을 처리해주었다.


<전체코드>

import java.util.HashMap;
import java.util.Map;

public class success_login {

	public static String solution(String[] id_pw, String[][] db) {
		String answer = "";
		
		Map<String, String> dbMap = new HashMap<String, String>();

        for (String[] strings : db) {
            dbMap.put(strings[0], strings[1]);
        }

        if (dbMap.containsKey(id_pw[0])) {
            if (dbMap.get(id_pw[0]).equals(id_pw[1])) {
                return answer = "login";
            } else {
                return answer = "wrong pw";
            }
        } else {
            return answer = "fail";
        }
    }
	
	public static void main(String[] args) {
		String[] id_pw = {"meosseugi", "1234"};
		
		String[][] db = {{"rardss", "123"},
						 {"yyoom", "1234"},
						 {"meosseugi", "1234"}};
		
		System.out.println(solution(id_pw, db));
	}

}

아이디와 패스워드의 일치를 담당하는 containsKey 메서드 부분이 핵심 부분이었다.

다만 id_pw[0]과 일치한 후 비밀번호를 일치시킬 경우에는 dbMap에서 get으로 값을 가져오고, equals로 String일치 처리를 해주었다. 


HashMap의 다양한 활용가능성을 공부할 수 있는 문제였다. 복수의 값을 다르게 처리하고자 할 때 필요한 자료구조이므로 사용법을 많이 공부해야겠다고 느꼈다.


문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120883

 

프로그래머스

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

programmers.co.kr