10월 27일

Yullgiii·2023년 10월 27일
0
post-thumbnail

내일 배움 캠프

팀프로젝트는 완료해서 다른 강의를 들으며 혹시나 팀원이 수정이 필요하다고 하는 부분이 있으면 수정을 하겠지만 어제 코드정리도 어느정도 마무리를 했기에 아마 개인 학습이 위주가 되지않을까 한다.

팀프로젝트 수정

예약을 확인하는 시스템에서 문제가 생겨서 조금의 수정을 거치게 되었다.

    private static void findReservation(Scanner sc, Hotel hotel) {
        System.out.println("\n----------------------------------\n");
//        System.out.print("조회할 예약 ID를 입력하세요: ");

        while (true) {
            try {
                String rev_id = inputInfo("조회할 예약 ID를 입력하세요: ", sc);
                Reservation customerRev = hotel.getCustomerReservations(rev_id);        // 조회된 고객 Reservation 객체 반환
                if (customerRev == null) {                                               // 반환된 객체가 없을 경우 잘못된 입력
                    System.out.println("잘못된 입력입니다.");
                } else {                                                                // 있을 경우 출력
                    System.out.println(customerRev.toString());
                    break;
                }
            } catch (IllegalArgumentException e) {
                System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
                System.out.println("메인메뉴로 돌아가시려면 9번을 눌러주세요.");

                String num = sc.nextLine();
                if (num.equals("9")) {
                    System.out.println("메인메뉴로 돌아갑니다.");
                    sc.nextLine();
                    break;
                }
            }
        }
    }

위의 부분의 코드가 에러가 발생하고 로직이 꼬여서 수정을 좀 하였다.
각각의 코드를 로직을 꼬이지 않게 하려면 좀더 직관적이게 보일 필요가있기떄문이다.
위의 코드의 아쉬운점을 이야기해보자면
1.예외가 발생했을 때만 메인 메뉴로 돌아가기를 시도
2.사용자에게 잘못된 입력을 했을 경우에만 메인 메뉴로 돌아가는 방법을 안내
3.예외 처리와 잘못된 예약 ID 처리가 같은 블록 내 존재
이것들을 손보고자 코드를 조금 바꿔보았다.

private static void findReservation(Scanner sc, Hotel hotel) {
    System.out.println("\n----------------------------------\n");
    while (true) {
        try {
            String rev_id = inputInfo("조회할 예약 ID를 입력하세요 (메인메뉴로 돌아가려면 9를 입력하세요): ", sc);

            // 메인 메뉴로 돌아가기를 원하는 경우
            if (rev_id.equals("9")) {
                System.out.println("메인메뉴로 돌아갑니다.");
                return;
            }

            Reservation customerRev = hotel.getCustomerReservations(rev_id);        // 조회된 고객 Reservation 객체 반환
            if (customerRev == null) {                                               // 반환된 객체가 없을 경우 잘못된 입력
                System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
            } else {                                                                // 있을 경우 출력
                System.out.println(customerRev.toString());
                break; // 조회에 성공하면 while문을 탈출합니다.
            }
        } catch (IllegalArgumentException e) {
            System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
        }
    }
}

이렇게 바꿔줌으로서 모든 일이 해결되었다고 한다 에러부터 가독성까지~!~~

혼자하는 프로젝트 (환율계산기)

어제 나름 새로이 배우는 API사용법에 대해서 했으니까
오늘은 그곳에다가 몇가지를 추가할예정이다
원래는 USD->KRW으로 밖에 환전이 안되었는데 KRW->USD도 만들어주고 환율정보도 표기를 해주며 한국만 있던 환전도 양방향으로 되게끔 구상을 할것이다.

환율 정보 받아오기

우선 제공된 API에 ttBuyingPricettSellingPrice가 존재하는것을 보고는
흔히 은행에서 보이는 살때 팔때 라는것을 떠오려서 그것을 적용해보기로 했다.

 USD_RATE = 1 / KRW_RATE; 

우선 이 코드를 써주면서 미쿡 달러 금액을 구하는 식을 만들어주고 시작한다.
그런데 이렇게 적고보니...뭔가 잘못됨을 느꼇다 여기는 파는가격과 사는가격이 정해져있는데 그것으로 환율을 구해야지 기본 가격으로 환율을 구하면 되지않으니까
각각의 정의를 다르게 해줄 필요가 있겠군!!!!!!!!

    private static double KRW_SELL_RATE; // USD -> KRW 환율 (파는 가격)
    private static double KRW_BUY_RATE;  // KRW -> USD 환율 (사는 가격)
    private static double USD_RATE;

이런식으로 계산을 끌어올걸 만들었는데 뭐가 이렇게 헷갈리지
살때 팔때가 너무 헷갈린다
자....보자 은행은 이윤을 남겨야하는 집단이다 그치???
그럼 달러를 소비자가 살때는 비싸게 팔때는 싸게 팔아야지 은행에선 이득이 남는다
저속하게는 환치기라고 하지,....그럼 현 시점으로 보면
ttBuyingPrice: 1341.6은행에다가 달러를 팔때!가격
ttSellingPrice: 1368은행에서 달러를 살때!가격
이니까....이겟지?????그러니까 저 바잉과 셀링은 은행의 기준에서 작성이된거야 그치??
그럼 코드는 소비자입장에서 짜는거니까 바잉과 셀링을 반대로 하면 소비자의 입장이되는거잖아?
그래...그 마음으로 다시 짜보자..

KRW_SELL_RATE = APIFetcher.fetchTTBuyingPrice();  // USD -> KRW
KRW_BUY_RATE =  1/APIFetcher.fetchTTSellingPrice() ;// KRW -> USD 환율 계산

이렇게 하는게 소비자의 계산에 맞는것이잖아? 그치???이 프로그램은 어쨋든 은행에 온 손님을 위한거니까??그치???
그리고는 환율 정보도 표시를 해줘야하니까...

            System.out.println("[ 환율정보 ]");
            System.out.println("현재환율 : " + KRW_RATE + "원");
            System.out.println(" 달러를 살때 " +  USD_RATE+ "원");
            System.out.println(" 달러를 팔때 " + KRW_SELL_RATE + "원");

이런형식으로 표현을 해주고

        System.out.println("1. 한국 (KRW)");
        System.out.println("2. 미국 (USD)");

이부분이 너무 헷갈리니까 바꿔주자고

    private static void calculateCurrency(Scanner scanner) {
        System.out.println("1. USD -> KRW : 달러 팔기");
        System.out.println("2. KRW -> USD : 달러 사기");
        System.out.print("원하시는 항복을 선택해주세요: ");
        int countryChoice = scanner.nextInt();
        System.out.print("환전하실 금액을 입력하세요: ");
        double amount = scanner.nextDouble();

이런식으로 직관적으로 변경을 해주고 해야지 나도 좀 알아먹지.....
이제야 좀 알아보겠네...
이제 마지막으로 식을 대입해주면 끝난다.

        double result = 0;
        switch (countryChoice) {
            case 1:
                result = amount *  KRW_SELL_RATE; // USD -> KRW (파는 가격)
                break;
            case 2:
                result = amount * KRW_BUY_RATE;   // KRW -> USD (사는 가격)
                break;
            default:
                System.out.println("잘못된 선택입니다.");
                return;

주석의 중요함과 안헷갈리는게 중요해....
아 그리고 중간에 말은 안했지만

    public static double fetchTTBuyingPrice() {
        JSONObject jsonObject = fetchJSONObject();
        return jsonObject.getDouble("ttBuyingPrice");
    }

    public static double fetchTTSellingPrice() {
        JSONObject jsonObject = fetchJSONObject();
        return jsonObject.getDouble("ttSellingPrice");
    }

위와 같은 식으로
APIFetcher 클래스도 변경을 해주었다는 점!!!
이제 가독성이나 확실하게 보여질수있게 조금 꾸미고나서 코드를 완성하는것으로 이 프로젝트는
끝을 내야겠다!!!

작동 사진


프로젝트 회고

이 프로젝트를 진행하면서 처음에는 단순히 인텔리제이에서 OpenAPI를 활용하는 방법을 탐구하는 것으로 시작했다. 처음엔 그저 한 기술을 익히는 것에 그칠 것이라 생각했다. 그러나 프로젝트를 진행하면서 이것이 단순한 기술 습득을 넘어서, 나의 개발 역량과 창의력, 그리고 문제 해결 능력을 키우는 중요한 경험이 되었다는 것을 깨달았다.
어떤 사람들은 이런 작은 프로젝트를 별 것 아니라고 생각할 수 있다. 그러나 나에게 있어 이는 큰 의미가 있었다. 본 프로젝트는 단순히 코드 몇 줄을 작성하는 것이 아니라, 문제를 정의하고, 필요한 기술을 탐구하고, 그것을 실제로 구현하는 전체 과정을 경험하는 것이었다.
또한, 이 프로젝트는 다른 사람의 지시나 요구에 의해서가 아니라 내 스스로의 의지로 시작했다. 이것은 나에게 주어진 과제를 수행하는 것이 아니라, 나 스스로가 문제를 찾아서 해결하는 능동적인 학습의 태도를 갖게 했다. 이러한 경험은 앞으로의 개발자로서의 삶에서 큰 자산이 될 것이라 확신한다.

알고리즘

가장 가까운 같은 글자

문제 설명
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

제한사항
1 ≤ s의 길이 ≤ 10,000
s은 영어 소문자로만 이루어져 있습니다.

위의 문제를 보면 구현되야하는 기능이 빈 리스트 answer를 초기화,문자열 s를 반복문으로 순회해야하고!answer를 반환하게 만들면되는것이다.
이건 맵을 써야해!!!!!!!!!!!

import java.util.HashMap;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        HashMap<Character, Integer> lastPosition = new HashMap<>();

        for (int i = 0; i < s.length(); i++) {
            char currentChar = s.charAt(i);
            
            // 마지막 위치가 기록되어 있다면 그 위치와 현재 위치의 차이를 answer에 저장한다.
            if (lastPosition.containsKey(currentChar)) {
                answer[i] = i - lastPosition.get(currentChar);
            } else {
                answer[i] = -1;
            }

            // 현재 문자의 마지막 위치를 업데이트한다.
            lastPosition.put(currentChar, i);
        }
        
        return answer;
    }
}

위의 코드에서 설명을 해보자면
1.HashMaplastPosition을 사용하여 각 문자의 마지막 위치를 저장
2.문자열 s의 각 문자를 순회하면서 해당 문자가 마지막으로 나타난 위치를 확인하고 그 위치와 현재 위치의 차이를 answer 배열에 저장
3.문자열 순회가 완료되면 answer를 반환합니다.
로 이어지는 일이다!!!

회고

이런식으로 오늘의 학습을 어느정도 마무리를 했지만 비록 강의를 듣지는 못했지만 실시간의 특강을 들으며 좋은개발자란 무엇인가에 대해 들으며 많은것을 느끼는 마무리의 시간이였다.
나 또한 목표는 좋은 개발자가 되기 위한 느릿느릿한 거북이의 걸음이라고 보여지면 좋겠다...
P.S. 개인과제의 평가로 주석을 달았으면 한다는 피드백을 받아서 이제는 내가 구현하는것에 주석을 좀 열심히 달아야겠다는 생각을 하게되었다!

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

0개의 댓글