Java/연습문제
자바 연습문제 - HashMap을 이용한 전화번호부 프로그램 구현
코딩하는냥이
2025. 5. 27. 16:39
반응형
📖 문제
- HashMap을 사용하여 전화번호부를 구현합니다.
- 반복 입력을 통해 다음 기능을 처리합니다:
- 전화번호 등록
- 이름과 전화번호를 입력받아 저장합니다.
- 이름이 중복되면 (1), (2) 등 숫자를 붙여 저장합니다.
- 전화번호 조회
- 입력한 이름이 정확히 일치하는 경우, 이름과 전화번호를 출력합니다.
- 입력한 문자열이 이름에 포함된 모든 항목도 함께 출력합니다.
- 전체 출력
- 저장된 모든 이름과 전화번호를 출력합니다.
- 프로그램 종료
📌 예제 정답
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
public class PhoneBookApp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, String> phoneBook = new HashMap<>();
while (true) {
System.out.println("-".repeat(45));
System.out.println("1) 등록 2) 조회 3) 전체 출력 4) 종료");
System.out.println("-".repeat(45));
System.out.print("입력 : ");
String input = sc.nextLine();
if (input.equals("1")) {
System.out.print("이름 입력 : ");
String name = sc.nextLine();
int count = 1;
while (phoneBook.containsKey(name)) {
name += "(" + count + ")";
count++;
}
System.out.print("전화번호 입력: ");
String num = sc.nextLine();
phoneBook.put(name, num);
System.out.println(name + "님의 전화번호가 저장되었습니다.");
} else if (input.equals("2")) {
System.out.print("조회할 이름 입력: ");
input = sc.nextLine();
boolean exactFound = false;
for (Map.Entry<String, String> entry : phoneBook.entrySet())
if (entry.getKey().equals(input)) {
System.out.println("정확히 일치하는 항목: " + entry.getKey() + " - " + telNum(entry.getValue()));
exactFound = true;
}
if (!exactFound)
System.out.println("정확히 일치하는 이름은 없습니다.");
System.out.println("이름에 '" + input + "'이(가) 포함된 항목:");
for (Map.Entry<String, String> entry : phoneBook.entrySet())
if (entry.getKey().contains(input) && !entry.getKey().equals(input))
System.out.println(entry.getKey() + " - " + telNum(entry.getValue()));
} else if (input.equals("3")) {
System.out.println("전체 전화번호 목록");
for (Map.Entry<String, String> entry : phoneBook.entrySet())
System.out.println(entry.getKey() + " - " + telNum(entry.getValue()));
} else if (input.equals("4")) {
break;
} else {
System.out.println("올바른 번호를 입력해주세요.");
}
}
System.out.println("프로그램을 종료합니다.");
}
public static String telNum(String num) {
String regNum = "(\\d{2,3})(\\d{3,4})(\\d{4})";
if (!Pattern.matches(regNum, num))
return num;
if (num.startsWith("070") && num.length() == 9)
return num;
else if (num.startsWith("02") && num.length() == 9)
return num.replaceAll(regNum, "$1-$2-$3");
else if (num.length() == 9)
return num;
return num.replaceAll(regNum, "$1-$2-$3");
}
}
💻 실행 예시
---------------------------------------------
1) 등록 2) 조회 3) 전체 출력 4) 종료
---------------------------------------------
입력 : 1
이름 입력 : 홍길동
전화번호 입력: 01012345678
홍길동님의 전화번호가 저장되었습니다.
...
입력 : 3
전체 전화번호 목록
홍길동 - 010-1234-5678
...
💬 코드 설명
- HashMap<String, String>을 통해 이름-전화번호 매핑을 저장합니다.
- 전화번호 중복 방지를 위해 중복된 이름에 숫자를 붙여 고유한 키로 만듭니다.
- 조회 기능은 입력한 이름과 완전히 일치하는 항목과, 이름에 부분 일치하는 항목을 각각 출력합니다.
- 전화번호는 정규표현식으로 하이픈(-)을 자동 포맷팅합니다.
💡 학습 포인트
- HashMap을 활용한 데이터 저장과 조회
- 중복 키 처리 전략: 이름 중복 시 (1), (2) 형식 처리
- 정규표현식을 활용한 전화번호 포맷팅
- 부분 문자열 검색과 정확한 키 검색 병행
- 기본적인 콘솔 UI 흐름 구성과 사용자 입력 처리
📌 마무리 정리
- 이 코드는 Map 컬렉션과 문자열 처리, 반복문, 조건문, 정규표현식 등을 종합적으로 활용한 실습입니다.
- 실무에서도 사용자 데이터 저장, 검색, 중복 체크 등의 로직을 구현할 때 이와 유사한 구조가 자주 사용됩니다.