231020 TIL

SEULBI LEE·2023년 10월 22일
3

TIL

목록 보기
7/25

키오스크 구현하기 2일차

나는 지금 3차원 배열을 엑셀 여러 겹처럼 보고 있다...
지금은 메뉴 카테고리가 출력될 수 있게,
엑셀로 치면 필터를 걸어 종류가 몇 개인지 카운팅하게 하고 싶다.
카테고리가 2개밖에 출력이 안 된다.

오류 메시지
Index 9 out of bounds for length 9
if문 선언이 잘못되었다고 한다.
i가 배열의 끝까지 탐색하는데, 배열의 범위를 넘어선 곳까지 탐색하게 선언되어 있어서 그런 것 같다.

//메뉴 카테고리, 반복문을 통해 중복을 제거하고, 카테고리마다 번호 붙여주기
        for(int i = 0 ; i < b.menu.length ; i++) {
            if (b.menu[i][0][0] == b.menu[i + 1][0][0]) {
                continue;
            } else {
                System.out.print(b.menu[i][0][0]);
                System.out.print(" | ");
                System.out.println(b.menu[i][0][1]);
            }
        }

이 문제는 이렇게 해결했다.
반복문이 배열의 범위를 넘어선 곳까지 탐색하지 않도록,
그리고 순차 비교이므로 마지막 정보값은 비교 대상이 없어 출력되지 않는 현상이 없도록
배열의 index와 i 값이 같아지는 순간을 가장 위로 올렸다.
그리고 순차 비교 시 true가 나올 경우 값을 출력하지 않고 다시 탐색하도록 했다.

for(int i = 0 ; i < menu.length ; i++) {
            if (Objects.equals(i, menu.length - 1)) {
                System.out.print(menu[i][0][0]);
                System.out.print(" | ");
                System.out.println(menu[i][0][1]);
            } else if (Objects.equals(menu[i][0][0],menu[i+1][0][0])){
                continue;
            } else {
                System.out.print(menu[i][0][0]);
                System.out.print(" | ");
                System.out.println(menu[i][0][1]);
            }
        }

그리고 카테고리별 메뉴 출력문도 어느 정도 만들었다.
food 값을 받아 배열의 원하는 요소를 출력하고, default 값도 설정.
break;를 걸지 않으니 메뉴가 무한 출력되어 무서웠다.

switch (food){
            case "마라탕", "꿔바로우", "음료":
                for(int i = 0 ; i < menu.length ; i++){
                    if(Objects.equals(food,menu[i][0][0])){
                        System.out.print(i + ". ");
                        System.out.print(menu[i][1][0] + " | ");
                        System.out.print(menu[i][1][1] + " | ");
                        System.out.println(menu[i][2][0] + " | ");
                    }
                }
                break;

            default:
                System.out.println("잘못된 이름을 입력하셨습니다.");
        }

어영부영 만들고 있는데, 만들다가 합치다가,,, 하면 꼭 문제가 생긴다.
장바구니 메서드, 삭제 메서드 등이 제대로 작동하지 않는다.

메인 메뉴를 다시 호출하려면 전체를 while문으로 묶어보라는 챗gpt의 조언을 들었다. 이제야 조금씩 눈이 생긴다.

if문, for문, switch문 범벅이지만 내 코드 자랑스럽다.
지금 남은 부분은 2가지이다.
1. 카테고리 -> 하위 카테고리 진입 시 범위를 벗어난 번호 입력하면 "잘못된 번호를 입력하였습니다." 메시지 띄우기.
왜냐면 하위 카테고리가 0~8 통으로 묶여있어서
화면에는 0, 1, 2번만 출력되지만
실제로는 8번까지 선택이 가능한 요상한 상태다.
2. 주문 total 값 출력하기
배열에 전부 String으로 저장되어서, parseInt 사용하고
향상된 for문이나 뭐 그런 거 사용해서 전부 더해서 누적하면 되지 않을까 하는 작은 희망을 가지고 있다.

알고리즘 세션

알고리즘은 문제를 해결하기 위한 단계적 절차, 또는 방법이라고 한다.
이해하기 쉬운 자연어로 적힌 코드를 슈도코드라고 하는데,
오늘 실시간 강의 때 슈도 코드로 문제를 풀고 대차게 틀렸다.
선착순 100명으로 티켓 당첨 이벤트를 할 때, 그 숫자를 낸 고객이 있는지 확인하는 문제였다.
list = {1,2,3,4,5,6,7,8,9}
target = 5

for(int i = 0 ; i < 100 ; i++){
if(list[i]==target){
"위치는 i+1번째입니다."
}
else{
"제출되지 않은 번호표입니다."
}
}

이렇게 쓰면 당첨 번호가 index 0에 있지 않은 이상, 어떤 숫자를 넣어도 막힌다.

for(int i = 0 ; i < 100 ; i++){
if(list[i]!=target){
continue;
}
else if(list[i] == target){
"위치는 i+1번째입니다."
}else if( i + 1 == list.length){
"제출되지 않은 번호표입니다."
break;
}
}

이러면 될까...? 혹시 확인해주실 분은 댓글 부탁드려요...

그 외, for문으로 돌렸을 때는 리스트를 처음부터 끝까지 탐색해야 하니 시간이 너무 오래 걸리는 문제가 있다.
오늘 세션에서는 예시로 이진 탐색이 소개되었다.

오늘 하루를 마무리하며

내 과제.
그래도 꼴은 조금씩 갖춰가는 중이다.
다른 분들은 자료구조형을 아주 적절하게 이용하면서 만드시는데
나는 자료구조형을 너무 늦게 이해하는 것 같다.(아직 이해 못했다.)
코드 리뷰 하면서 힌트를 많이 얻을 수 있어 좋다.
주는 것 없이 받기만 하는 것 같지만...
언젠가 사회에 환원하겠습니다.
만원이라도 기부하겠습니다.

조금만 더 만져봅시다.
주말도 화이팅.
그리고 반 배정이 있다는데,
초급반 가서 복습 열심히 해보자...!

(다 써놨는데 ㅠㅠ 임시 저장하고 출간을 안 했네...)

0개의 댓글