10월 20일

Yullgiii·2023년 10월 20일
3
post-thumbnail

내일 배움 캠프

어제 구현하지 못했던 추가 요구사항을 하나씩 천천히 구현해보도록하자...아마 다는 못할거같아...

옵션 추가 항목 구성하기(결론 : 실패)

우선 커피숍이니까 1번으로 샷추가 옵션을 넣어보려한다!!!
샷추가는 필수니까!!!!
그러기 위해서는....뭘 건드려야하지...
Product클래스를 건드려보자.
우선 옵션 가격과 이름을 받아줘야하니까...

    private String option;
    private double optionPrice; 

추가해주고!!!

        this.option = ""; 
        this.optionPrice = 0;

기본 옵션을 정할게 아니라서 일단 옵션은 없음으로 넣고 옵션의 가격도 0으로 지정해준다...
맞는지는 모르지만 일단 가보는거야!!!
그리고 옵션 값도 받아줘야하니까

    public void setOption(String option, double optionPrice) {
        this.option = option;
        this.optionPrice = optionPrice;
    }

이렇게 하는중이긴한데 맞겎ㅆ지...?

    public String getOption() {
        return option;
    }
    public double getOptionPrice() {
        return optionPrice;
    }

옵션을 받아줄 친구들도 맞이해주고!!!

    public double getTotalPrice() {
        return price + optionPrice;
    }

그냥 원래있던 가격에 옵션 가격을 추가해줘야하기에 이러한 친구도 넣어주고
가장중요한 카트 부분에!!!!

       if(product.getCategory().equals("Coffee")) {
            System.out.println("\n옵션을 추가하시겠습니까?");
            System.out.println("1. 샷추가 (₩ 0.5)");
            System.out.println("2. 추가없음");
            System.out.print("선택: ");
            int optionChoice = scanner.nextInt();
            scanner.nextLine();

            if(optionChoice == 1) {
                product.setOption("샷추가", 0.5);
            }
        }

를 해줌으로서 우선 커피쪽에만 한번 해보자고...
안된다...
뭔가 꼬였다...
너무 간단하게 생각했나보다.......젠장......
좀 더 생각을 해보자 현재는 안뜨는것들은 가격이 우선 합쳐지지않는다
그리고 카트에 담기는 순간 전혀 뜨지않는다.
너무 하나만으로 아둥바둥한걸까????
그렇다면 어떻게 좀더 확실히 할수있을까
젤 먼저 떠오른건 Kiosk 클래스가 유일하게 많이 가지고 있던부분이 장바구니 기능이라고 생각이 된다
키오스크 클래스는 인터페이스 기능만을 담당하게 바꿔보는건 어떨까?>??/
ShoppingCart를 하나 만들어야겠다.
아 뭔가 너무 엉켰다...심하게 엉켯어....
이럴땐 어찌한다?바로 다 날리고 다시 해보자
뒤로 돌아간다 깃에 올려둔것만 끌어와서 다시 해봐야지....
멘탈이 너무 너덜너덜하다
현 상황은 아무것도 이룬게 없다
쇼핑카트에는 가격이 추가된 상태로 담기지 않는다는것을 확인했고
그래서 3번을 갈아엎었다....왜 왜안되는거지
우선 정말 키오스크 클래스에서 인터페이스만 담당을하게끔 하고 카트를 뺴는작업부터 하자....

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

public class Cart {
    private Map<Product, Integer> items;

    public Cart() {
        this.items = new HashMap<>();
    }

    public void addItem(Product product) {
        items.put(product, items.getOrDefault(product, 0) + 1);
    }

    public Map<Product, Integer> getItems() {
        return items;
    }

    public void clear() {
        items.clear();
    }

    public boolean isEmpty() {
        return items.isEmpty();
    }

    public double getTotal() {
        double total = 0;
        for (Map.Entry<Product, Integer> entry : items.entrySet()) {
            Product product = entry.getKey();
            int quantity = entry.getValue();
            total += product.getPrice() * quantity;
        }
        return total;
    }
}

우선 이런식으로 카트의 기능을 하던 친구를 쫙 뽑아와서 적용하고

    private Map<Product, Integer> cart = new HashMap<>();
원래는 이렇게 기능을 하던 친구도 이제는 카트로 빼버렸으니까
    private Cart cart = new Cart();
    이런식으로 받아오게만 바꿔주고
cart.put(product, cart.getOrDefault(product, 0) + 1);

이부분도 이제는 받아올곳이 없응께...

cart.addItem(product);

요로케 바까주고 해주면 옮기기 끝나는거아녀!!!!
어휴,,,이제 다시 시작해볼까??? 좀 새로워지게....일단 잘되는지 테스트

오호라....조졌네 이거....
와 해결했다...

 for (Map.Entry<Product, Integer> entry : cart.getItems().entrySet()) {

카드에서 받아오는걸 바꿔주지 않았으니...받아올수가 없는것이였다...
거하게 조진줄 알았네....진짜 다행스럽다....휴...
이제 그 추가요구사항은 잠시 내려두고 이왕 분리를 한김에 하나씩 삭제할수있는 기능을 구현해봐야겟다.
하지만 그전에 우선 불안하니까 깃에 올려두고!!!

항목 별로 삭제하기!!

이건 생각보다 쉬운일이였던것 같다.
우선 카트를 분리했으니까
카트쪽에다가

public void removeItem(Product product) {
    items.remove(product);
}

를 추가해줌으로서 내가 작업을 할끄야~~라고 알려준뒤에 시작을 해보자고
그리고는 원래 있던 3.다시담기를 수정해줄 필요가있다 다시 담기는 싹다 비워버리고 그냥 하는거라서 다시담기보다는 메뉴변경이나 메뉴취소가 좋을듯하다
그렇게 변경을 해주고
3을 눌렀을때 비워졌으니 다시 담아주세요 하던 멘트를 없에고

case 3:
    removeItemFromCart();
    break;

요녀석을 넣어줌으로 함수를 호출해주고!

private void removeItemFromCart() {
    System.out.println("\n주문 목록");
    List<Product> cartItems = new ArrayList<>(cart.getItems().keySet());

cart.getItems().keySet()을 사용해 장바구니의 모든 상품들의 키를 가져 온 다음에 ArrayList로 변환하여 cartProducts라는 리스트에 저장하게끔 만들어 주는것이지

    for (int i = 0; i < cartItems.size(); i++) {
        System.out.println((i + 1) + ". " + cartItems.get(i).getName());
    }

그리고 이건 뭐 냅따 출력하는것이렸다!!!!

    System.out.println((cartItems.size() + 1) + ". 뒤로가기");
    System.out.print("삭제할 항목을 선택하세요: ");
    int choice = scanner.nextInt();
    scanner.nextLine();

그리고 혹시나 삭제를 안할껄 대비해서 뒤로가기도 준비를 해주고
뒤로가거나 삭제하거나를 입력할 창을 만들어주면 된다!!!

    if (choice > 0 && choice <= cartItems.size()) {
        Product selectedProduct = cartItems.get(choice - 1);
        cart.removeItem(selectedProduct);
        System.out.println(selectedProduct.getName() + "을(를) 장바구니에서 삭제했습니다.");
    }
}

그리고는 삭제가 되면 따란~~~완료되었습니다!!!!
안됬어 젠장....
이렇게 하니까 중복이 몇개가 되어있던...예를들어 아메리카노를 2개 담았는데 삭제를 하면 싹 다 지워져버린다...
1개만 지워지는게 아닌!!!!!
자 우리 다시 해보자....removeItem이 아니라 removeOneItem으로 변경을 해보자고...

하나씩 삭제하기!!!

우선 카트를 바꿔줬다.

    public void removeOneItem(Product product) {
        if (items.containsKey(product)) {
            int currentQuantity = items.get(product);
            if (currentQuantity > 1) {
                items.put(product, currentQuantity - 1);
            } else {
                items.remove(product);
            }
        }
    }

특정 상품의 수량을 장바구니에서 하나 줄이거나, 해당 상품의 수량이 1개일 경우 장바구니에서 해당 상품을 완전히 제거하는 기능을 하는 것이다 저기저기 보면 알지만 1보다 많을때는 -1 을 해주고 아닐때는 그냥 삭제!하는것이니까...
그리고 이제 본판으로 돌아가서 일해야지~

    private void removeItemCart() {
        System.out.println("\n주문 목록");
        List<Product> cartProducts = new ArrayList<>(cart.getItems().keySet());
        for (int i = 0; i < cartProducts.size(); i++) {
            Product product = cartProducts.get(i);
            int quantity = cart.getItems().get(product);
            System.out.println((i + 1) + ". " + product.getName() + " | " + quantity + " 개");
        }
        System.out.println("삭제할 항목의 번호를 입력해주세요: ");
        int choice = scanner.nextInt();
        scanner.nextLine();
        if (choice > 0 && choice <= cartProducts.size()) {
            Product selectedProduct = cartProducts.get(choice - 1);
            cart.removeOneItem(selectedProduct);
        }
    }

내가 이걸 짜는데 걸린시간은 어마어마하고 잘되는지 테스트도 해보고오고 한다고 더 오래걸렸지만 여러분의 시간은 소중하니까..생략하도 짠 코드를 보여드립지요...
우선 장바구니의 상품을 가져와서 cartProducts에 저장하고
for문을 이용해서 장바구니에 모든걸 출력해준다...
그리고 삭제할것 번호를 부여받고!!!!
삭제할꺼를 선택하면 해당번호에 상품을 selectedProduct에 저장,cart.removeOneItem(selectedProduct);을 호출해서 하나 줄여버리는 역할이다...아 머리아프다...진짜....
눈앞에 추가 요구 사항 2번이 아른거리지만 그건 제일 마지막에 해보자
지금 진짜 그거 하면 짜증날꺼같으니까!

추가요구사항 4번 총 판매목록 조회 기능 추가

이번에도 빠르게 가자고...여러분의 시간은 소중하니까...
우선 확실한 요구 사항을 알필요가 있다

  1. 총 판매상품 목록 조회 기능 추가
    • 구매가 완료될 때마다 판매 상품 목록을 저장해줍니다.
    • 숨겨진 기능으로 0번 입력 시 총 판매 상품 목록을 출력합니다.

이런 요구 사항이 있는데...의문을 가질수있다 왜 4번부터하니 3번이있는데?
그런데 요구사항을 봤을때는 3번은 총 판매 금액을 출력하는것이다
즉 뭔말이냐?목록을 먼저해두면 나중에 덧샘만 하는 공식을 만들면 된다는것이다 어쩜이리도 꿀일수 있겠는가....
그러니 가보자고!
우선 클래스내에 변수를 추가해줘야한다.

private double totalSales = 0;
private Map<Product, Integer> productSales = new HashMap<>();

이렇게totalSales금액을 저잘할 변수를 추가해주고 그리고 저기 뭐라고 적혀있는가 숨겨진 기능!!!즉 누구에게도 보이면 안된다 이말이야!!!
그러니

    case 0:
        showTotalSales();
        break;

를 추가해주되 표시는 해주지않는다 어느 문구도 없다 이말이야!
그리고 나서는 매출이지않는가???
매출이다=팔렸다=결제하기를 눌렀다 라는 사고로 반영되니까
토탈값을 1.결제하기를 눌렀을때만 실행하게끔 변경하면된다
그러니

switch (choice) {
case 1:

System.out.println("결제가 완료되었습니다. 이용해주셔서 감사합니다!");
System.out.println("당신의 대기 번호는 " + waitingNumber + "번입니다.");
waitingNumber++;
cart.clear();

원래는 이랬던 녀석에게 그대로 대기 하다가 나오면 되는 친구에게 일을 하나 더 시키는거지
어떻게?

    totalSales += total;
    for (Map.Entry<Product, Integer> entry : cart.getItems().entrySet()) {
        productSales.put(entry.getKey(), productSales.getOrDefault(entry.getKey(), 0) + entry.getValue());
    }

이런식으로 시키면 된다 이말이야!!!!
그렇게 하면 이제 원하는 물건을 얼마나 팔았는지가 출력이 된다!!!
이건 이렇게 쉬워지는데 왜 2번은 어렵냐고...왜....
그럼 이제 이렇게 했으니까 스리슬쩍 꿀을 먹으러 가볼까?

3번 누적 판매 금액 출력

쉽지 않을까./...?

double cumulativeSales = 0;

우선 showTotalSales에 새로운 변수를 생성해주고

double productTotalSales = entry.getKey().getPrice() * entry.getValue();
        cumulativeSales += productTotalSales;

이렇게 각 상품별 판매금액을 누적한뒤에 전체를 더해주면 되지 않나....?
테스트 두둥두욷욷...두구두구두구두구

되었잖아~! 역시 젤 간단했어...
이제 그럼 남은건 망할...2번인건가....?제길....
다시 도전해본다

추가사항 2번

보다 우선 깃에 먼저 올려두고 하자...
또 망하면 뒤집어야하잖아?
자 처음부터 다시 해보는거야 어쩃든 Product에 추가될꺼야 그치?
처음부터 쭉 하고 있었는데
옵션 클래스를 만드려다가 실패했다
다시 엎어!!!!!!!!!!!
다시해보자..젠장...환장하겠네...
다시 해보자,......
이미지구상을 바꿔야해...
우선 우리 product처럼 바꿔보는거야 옵션클래스를 만들어서 내용을 저장할수있게끔 무슨말인지알지?
이젠 메모하며 해보자 진짜...너무 화난다
우선 option 클래스 생성...

class Option {
    private String name;
    private double price;

    public Option(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return name + " (+₩" + price + ")";
    }
}

그리고 product에 옵션관련 항목 생성시켜주고.....
스위치문에도 추가를 해주도 하는데도 안된다...
너무 짜증이난다..
이거 월요일에 해봐야겠다...

깔끔히(사실질척임...) 포기하고 풀어보는 알고리즘 문제!!

달리기 경주!

문제 설명
얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.

선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.

제한사항
5 ≤ players의 길이 ≤ 50,000
players[i]는 i번째 선수의 이름을 의미합니다.
players의 원소들은 알파벳 소문자로만 이루어져 있습니다.
players에는 중복된 값이 들어가 있지 않습니다.
3 ≤ players[i]의 길이 ≤ 10
2 ≤ callings의 길이 ≤ 1,000,000
callings는 players의 원소들로만 이루어져 있습니다.
경주 진행중 1등인 선수의 이름은 불리지 않습니다.

흠 좋아 풀어보도록 하자구
우선 경기중에 해설진이 부르는 선수는 하나의 등수가 오른다!->1등이 추월할수는 없게 해야한다 1등이 추월하면 뭐 0등 될껀아니잖아?
그런걸 생각하면서 플어보자고,,,
우선 다 끌고 와야지!!내가 뭘쓸지 감이 안잡히니까~~ㅎㅎ

import java.util.*;

해주고
선수들의 이름을 key로 생각하고 등수를 value로 가지는 맵을 만들면...
순서도 반환해줘야하니까

    public static String[] solution(String[] players, String[] callings) {
        Map<String, Integer> rankMap = new HashMap<>();
        for (int i = 0; i < players.length; i++) {
            rankMap.put(players[i], i);
        }

for문을 이용하여 초기 선수들의 순서를 rankMap에 저장해주고!!

  for (String calling : callings) {
            int rank = rankMap.get(calling);

해설자가 부르는 선수의 이름을 찾아서 목록을 뒤지다가 몇번쨰인지 찾고 바로 앞 선수랑 위치를 교채!!!!
그렇게 교체가 되면 그걸 적용해야하니

            rankMap.put(players[rank], rank);
            rankMap.put(players[rank - 1], rank - 1);
        }

하고나서 결과값을 반환하면 끝!

결론은 첫 순서를 rankMap이라는 HashMap에 저장하고 해설자가 부른 선수가 어딧는지 확인하고 앞사람하고 순서를 바꾼다! 그뒤 그걸 저장하고 마지막에 결과값을 반환하는 문제이다!!!

회고

오늘 결국 해내지 못했다
다른건 다 구현을 했는데
2번쨰꺼.,....미쳐버릴꺼같다..
처참한 패배다
월요일에 다시 도전한다 주말동안 좀 뇌를 채우고 다시오자 분명 주말에도 그걸 계속 생각하면서 짜증이 나있겠지?하지만 어쩌겠는가 내가 잘 하지 못하였고 잘 해나가면 되는거 아니겠는가....
너무 정신적으로 힘든것같다
힐링으로 알고리즘을 했는데 괜히 Lv.1을 해서 제길 0단계할껑.,.....
힐링은 전혀 되지 못하고 짜증만 두배로 나는 경험이 되어버렸다...

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글