<문제 제시>
<문제설명>
머쓱이는 프로그래머스에 로그인하려고 합니다.
머쓱이가 입력한 아이디와 패스워드가 담긴 배열 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
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '문자열 밀기' - Java (0) | 2023.07.14 |
---|---|
[프로그래머스] '특이한 정렬' - Java (0) | 2023.07.13 |
[프로그래머스] '등수 매기기' - Java (0) | 2023.07.12 |
[프로그래머스] '유한소수 판별하기' - Java (0) | 2023.07.12 |
[프로그래머스] '달리기 경주' - Java (0) | 2023.05.21 |