나는 지금 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문으로 돌렸을 때는 리스트를 처음부터 끝까지 탐색해야 하니 시간이 너무 오래 걸리는 문제가 있다.
오늘 세션에서는 예시로 이진 탐색이 소개되었다.
내 과제.
그래도 꼴은 조금씩 갖춰가는 중이다.
다른 분들은 자료구조형을 아주 적절하게 이용하면서 만드시는데
나는 자료구조형을 너무 늦게 이해하는 것 같다.(아직 이해 못했다.)
코드 리뷰 하면서 힌트를 많이 얻을 수 있어 좋다.
주는 것 없이 받기만 하는 것 같지만...
언젠가 사회에 환원하겠습니다.
만원이라도 기부하겠습니다.
조금만 더 만져봅시다.
주말도 화이팅.
그리고 반 배정이 있다는데,
초급반 가서 복습 열심히 해보자...!
(다 써놨는데 ㅠㅠ 임시 저장하고 출간을 안 했네...)