CODING/스파르타 내일배움캠프 TIL

25_핸드폰 번호 가리기_도전과제 레벨 6-1 구현_자바 강의 String_25.1.16(목)

codingTrip 2025. 1. 16. 22:33

코트카타

27) 핸드폰 번호 가리기

나의 풀이

class Solution {
    public String solution(String phone_number) {
        String answer = "";
        char[] charArr = phone_number.toCharArray();
        for(int i=0;i<charArr.length-4;i++){
            charArr[i]   = '*';
        }
        answer = String.valueOf(charArr);
        return answer;
    }
}

char 배열로 만들어서 그 길이의 -4까지만 * 값을 넣어주고

다시 Strign 타입으로 바꾸었다.

 

다른 분들의 풀이

class Solution {
  public String solution(String phone_number) {
      String answer = "";

        for (int i = 0; i < phone_number.length() - 4; i++)
            answer += "*";

        answer += phone_number.substring(phone_number.length() - 4);

        return answer;
  }
}

출처:https://school.programmers.co.kr/learn/courses/30/lessons/12948/solution_groups?language=java

나도 subString을 사용하고 싶었는데...

위와 같이 바로 answer에 값을 넣는 방법이 더 깔끔해보인다.


개인 과제 진행

Lv6-1 트러블슈팅

switch문 -> if문으로 수정

필수 과제까지는 입력값에 따라 결과를 각각 다르게 출력해주는 조건문에 switch문을 사용했었다.

switch (inputSecondNumber) {
    case 0:
        System.out.println("뒤로 갑니다.");
        break;
    case 1:
         menuItem = menuItems.get(0);
         System.out.printf("1. %s | W %.1f | %s%n", menuItem.getName(),menuItem.getPrice(),menuItem.getInfo());
        break;
    case 2:
        menuItem = menuItems.get(1);
        System.out.printf("2. %s | W %.1f | %s%n", menuItem.getName(),menuItem.getPrice(),menuItem.getInfo());
        break;
    case 3:
        menuItem = menuItems.get(2);
        System.out.printf("3. %s | W %.1f | %s%n", menuItem.getName(),menuItem.getPrice(),menuItem.getInfo());
        break;
    case 4:
        menuItem = menuItems.get(3);
        System.out.printf("4. %s | W %.1f | %s%n", menuItem.getName(),menuItem.getPrice(),menuItem.getInfo());
        break;
    default:
        throw new IllegalArgumentException("보기 중에 없는 번호이거나 숫자가 아닙니다. 다시 입력해주세요.");
}

 

그런데 도전 과제에서도 위와 같이 구현하기에는 어려운 점이 있었다.

왜냐하면 장바구니(cart) 기능이 추가되었기 때문이다.

필수 과제에서는 해당 메뉴 아이템을 선택하면 바로 주문하는 것으로 끝나면 되었다.

(메인 메뉴판 -> 메인 메뉴 선택 -> 선택한 메뉴의 상세 메뉴 출력 -> 상세 메뉴 선택 -> 해당 상세 메뉴 주문 완료)

 

하지만 도전 과제에서는 과정이 더 추가되어서 로직이 복잡해졌다.

(메인 메뉴판 -> 메인 메뉴 선택 -> 선택한 메뉴의 상세 메뉴 출력 -> 상세 메뉴 선택
-> 해당 메뉴 아이템 선택 -> 장바구니 추가 y/n -> y인 경우, 추가
-> 메인 메뉴판 (주문 관련 내용 추가 4,5번) -> 4번 클릭 시 장바구니 리스트 출력
-> 주문 여부 y/n -> y인 경우, 주문하고, 장바구니 리셋)

 

그렇다 보니 if문으로 오류 -> 종료 -> 정상로직 순서로 구현하게 되었다.

if (chooseMainMenu < 0 || chooseMainMenu > 5) {
    System.out.println("보기 중에 없는 번호입니다. 다시 입력해주세요.");
    sc.nextLine();
} else if (chooseMainMenu == 0) {
    System.out.println("프로그램을 종료합니다.");
    return;
} else if (chooseMainMenu == 4) {
    if(cart.getCartList().size()!=0){
        kiosk.orderMenu(cart, cartList);
        int chooseOrder = sc.nextInt();

        if (chooseOrder == 1) {
            System.out.printf("주문이 완료되었습니다. 금액은 W %.1f 입니다.%n", cart.totalPriceCal(cartList));
            cartList.removeAll(cartList);
        } else if (chooseOrder == 2) {
            sc.nextLine();
        }
    } else {
        System.out.println("보기 중에 없는 번호입니다. 다시 입력해주세요.");
        sc.nextLine();
    }
} else if (chooseMainMenu == 5) {
    if(cart.getCartList().size()!=0){
        System.out.println("진행중인 주문이 취소되었습니다. 장바구니가 초기화 됩니다.");
        cartList.removeAll(cartList);
    } else {
        System.out.println("보기 중에 없는 번호입니다. 다시 입력해주세요.");
        sc.nextLine();
    }
} else if (chooseMainMenu > 0 && chooseMainMenu < 4) {
    Menu menu = menuList.get(chooseMainMenu - 1);
    List<MenuItem> menuItems = menuList.get(chooseMainMenu - 1).getMenuItems();

    if (menuItems == null){
        System.out.println("해당 메인 메뉴의 상세 메뉴가 없습니다.");
        continue;
    } else {
        System.out.println("[ " + menuList.get(chooseMainMenu - 1).showCategory().toUpperCase() + " MENU ]");
        menu.showMenuItem();
    }

 

if-else를 선택한 이유 요약

  • 조건의 범위와 복잡한 비교를 처리해야 함.
  • 유연한 조건 추가 및 수정이 가능.
  • 예외 처리 및 부적합한 입력 처리를 포함.
  • 유지보수 및 확장성이 더 좋음.

mvc 패턴

model view controller 패턴

이 패턴을 적용하고 싶었는데 생각만큼 잘 되지 않았다.

(아래 문제 참고)

 

Kiosk 클래스를 KioskView 와 KioskController 클래스로 분리하면서 발생한 문제점

-> 총 합계 금액이 0이 나오는 문제

[ Orders ]
ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거

[ Total ]
W 0.0

1. 주문       2. 메뉴판

 

2개로 분리를 하면서 문제가 발생했다.

KioskView 클래스에도 Cart 클래스의 인스턴스를 새로 생성한 것이 원인이었다.

Cart cart = new Cart();


그러다 보니 KioskController에서 생성한 Cart 클래스의 인스턴스와는 다른 새로운 객체를 생성하게 되었다.

장바구니 목록이 잘 나온 이유는 아래 코드를 보면 알 수 있다.

public void orderMenu(List<MenuItem> cartList) {
    System.out.println("아래와 같이 주문 하시겠습니까?\n");
    System.out.println("[ Orders ]");
    for (MenuItem c : cartList) {
        System.out.printf("%s | W %.1f | %s%n", c.getName(), c.getPrice(), c.getInfo());
    }
    System.out.println("\n[ Total ]");
    System.out.printf("W %.1f%n",cart.totalPriceCal());

    System.out.println("\n1. 주문       2. 메뉴판");
}

장바구니 목록은 장바구니 리스트를 controller에서 매개변수로 받아오기 때문에 출력이 잘 된다.

그러나, 총합계 계산 메서드의 경우에는 장바구니 리스트가 아닌 장바구니 클래스의 인스턴스의 메서드를 실행하는 것이라서

새로운 장바구니 클래스의 인스턴스는 당연히... 비어있어 초기화된 값을 출력했던 것이었다.

public void orderMenu(Cart cart, List<MenuItem> cartList) {}

그래서 위와 같이 controller에서 장바구니 클래스의 인스턴스도 같이 매개변수로 받아오게 했다.

 

 

남은 과제

튜터님께서 View에는 입출력(Scanner),

Controller에는 로직만 남기라고 하셨는데...

예외처리를 어느 정도 if문 안에서 처리하다보니, controller에도 scanner 클래스가 필요했다.

sc.nextLine() 남발하는 예외처리 이대로 괜찮은가...

if (chooseMainMenu < 0 || chooseMainMenu > 5) {
    System.out.println("보기 중에 없는 번호입니다. 다시 입력해주세요.");
    sc.nextLine();
}

김영한의 실전 자바 - 중급1편

StringBuilder sb = new StringBuilder();
sb.append("A");
sb.append("B");
sb.append("C");
sb.append("D");
System.out.println("sb = " + sb);

sb.insert(4,"Java");
System.out.println("insert = " + sb);

sb.delete(4,8);
System.out.println("delete = " + sb);

sb.reverse();
System.out.println("reverse = " + sb);

//StringBuilder -> String
String string = sb.toString();
System.out.println("string = " + string);

가끔 다른 분들의 풀이를 보다보면 StringBuffer(StringBuilder와 비슷한 기능을 함)를 사용하시는 분들이 계시던데

이제 나도 배웠으니 알고리즘 문제 풀 때 유용하게 사용될 것 같다.

 

StringBuilder sb = new StringBuilder();
String string = sb.append("A").append("B").append("C").append("D")
        .insert(4,"Java")
        .delete(4,8)
        .reverse()
        .toString();
System.out.println("string = " + string);

chaining 기법에 대해서도 배웠는데...

진짜 신기하다. 스트림에 대해 처음 알았을 때와 비슷한 반응이 나왔다.