Java/연습문제

자바 연습문제 - HashMap을 이용한 전화번호부 프로그램 구현

코딩하는냥이 2025. 5. 27. 16:39
반응형

📖 문제

  • HashMap을 사용하여 전화번호부를 구현합니다.
  • 반복 입력을 통해 다음 기능을 처리합니다:
  1. 전화번호 등록
    • 이름과 전화번호를 입력받아 저장합니다.
    • 이름이 중복되면 (1), (2) 등 숫자를 붙여 저장합니다.
  2. 전화번호 조회
    • 입력한 이름이 정확히 일치하는 경우, 이름과 전화번호를 출력합니다.
    • 입력한 문자열이 이름에 포함된 모든 항목도 함께 출력합니다.
  3. 전체 출력
    • 저장된 모든 이름과 전화번호를 출력합니다.
  4. 프로그램 종료

📌 예제 정답

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>을 통해 이름-전화번호 매핑을 저장합니다.
  • 전화번호 중복 방지를 위해 중복된 이름에 숫자를 붙여 고유한 키로 만듭니다.
  • 조회 기능은 입력한 이름과 완전히 일치하는 항목과, 이름에 부분 일치하는 항목을 각각 출력합니다.
  • 전화번호는 정규표현식으로 하이픈(-)을 자동 포맷팅합니다.

💡 학습 포인트

  1. HashMap을 활용한 데이터 저장과 조회
  2. 중복 키 처리 전략: 이름 중복 시 (1), (2) 형식 처리
  3. 정규표현식을 활용한 전화번호 포맷팅
  4. 부분 문자열 검색과 정확한 키 검색 병행
  5. 기본적인 콘솔 UI 흐름 구성과 사용자 입력 처리

📌 마무리 정리

  • 이 코드는 Map 컬렉션과 문자열 처리, 반복문, 조건문, 정규표현식 등을 종합적으로 활용한 실습입니다.
  • 실무에서도 사용자 데이터 저장, 검색, 중복 체크 등의 로직을 구현할 때 이와 유사한 구조가 자주 사용됩니다.