17-java - 1차원 배열 문제들

jin·2022년 5월 22일
0

문제1-1 값 교체 문제1

인덱스 2개를 입력받아 값 교체하기
예 1) 인덱스1 입력 : 1 , 인덱스2 입력 : 3
{10, 40, 30, 20, 50}

문제1-2 값 교체 문제2

값 2개를 입력받아 값 교체하기
예 2) 값1 입력 : 40 , 값2 입력 : 20
{10, 20, 30, 40, 50}

Scanner sc = new Scanner(System.in);
int[] array = { 10, 20, 30, 40, 50 };	

System.out.println("인덱스 2개 입력받아 값 교체하기");
System.out.print("첫번째 인덱스 입력 : ");
int index1 = sc.nextInt();
System.out.print("두번째 인덱스 입력 : ");
int index2 = sc.nextInt();
// 단순히 인덱스값을 입력받아 속성(값)을 바꾸는건 for문이 필요없음 --> 인덱스값이 제시되었기 때문에
// 임시 저장 변수는 있어야함
int temp = 0;
temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
System.out.println(Arrays.toString(array));


System.out.println("값(속성) 2개 입력받아 값 교체하기");
System.out.print("첫번째 값(속성) 입력 : ");
int element1 = sc.nextInt();
System.out.print("두번째 값(속성) 입력 : ");
int element2 = sc.nextInt();
//속성을 입력받는 경우 인덱스값을 구해야함 --> for
//인덱스값 저장 변수 2개 필요
int index1Temp = 0, index2Temp = 0;
for (int i = 0; i < array.length; i++) {
	if (array[i] == element1) {
		index1Temp = i;
	} else if (array[i] == element2) {
		index2Temp = i;
	}
}
array[index1Temp] = element2;
array[index2Temp] = element1;

System.out.println(Arrays.toString(array));

sc.close();

인덱스가 제시된 경우는 굳이 for문으로 해당 인덱스를 찾을 필요가 없다.


위의 문제1번 답을 안보고 풀어봤었다.
그 결과 문제에서 인덱스가 주어졌음에도 값을 찾아야한다는 편견에 사로잡혀 for문을 사용했고 결국 쓰나 안쓰나 답은 정상적으로 나왔다. 필요하지 않은 상황이라면 사용하지 않는게 베스트다.

Scanner sc = new Scanner(System.in);

int arr1[] = { 10, 20, 30, 40, 50 };

System.out.println("인덱스 입력 받아 자리 바꾸기");
System.out.print("인덱스1 입력 : ");
int index1 = sc.nextInt();
System.out.print("인덱스2 입력 : ");
int index2 = sc.nextInt();

int temp1= 0;
// 인덱스를 알면 for문도 필요 없다... 나는 무슨 고생을.......
for (int i = 0; i < arr1.length; i++) {
	temp1 = arr1[index1];
	arr1[index1] = arr1[index2];
	arr1[index2] = temp1;
//			굳이... if문 안써도 된다.......
//				if (index1 == i) {
//					temp1 = arr1[i];
//					arr1[index1] = arr1[index2]; 
//				} else if (index2 == i) {
//					arr1[i] = temp1;
//				}
}
System.out.println(Arrays.toString(arr1));

위의 문제2 정답을 안보고 나름 생각해서 푼 결과 필요없는 변수가 너무 많았다...

Scanner sc = new Scanner(System.in);

int arr2[] = { 10, 20, 30, 40, 50};
System.out.println("값 2개 입력받아 자리바꾸기");
System.out.print("첫번째 바꿀 값 입력 : ");
int element1 = sc.nextInt();
System.out.print("두번째 바꿀 값 입력 : ");
int element2 = sc.nextInt();

int index1Temp = 0;
int index2Temp = 0;
// int element1Temp = 0; 굳이 속성에 대한 temp도 필요없음....
// int element2Temp = 0;

//		int index = arr2.length-1;
for (int i = 0; i < arr2.length; i++) {
	if (arr2[i] == element1) { // 바꿀 속성값이 몇번째 위치인지 찾기
//				element1Temp = arr2[i];
		index1Temp = i;
	} else if (arr2[i] == element2) {
//				element2Temp = arr2[i];
		index2Temp = i; //띵킹결과 필요없는듯? 아닌가? 아님말고? --> 필요하다... 정확하게는 인덱스만 필요함
	}
}
arr2[index1Temp] = element2;
arr2[index2Temp] = element1;

System.out.println(Arrays.toString(arr2));

문제2 4의 배수만 저장

[조건1] arr 배열에서 4의 배수만 골라 temp 배열에 저장
단! temp 의 길이를 4의 배수의 개수 만큼만 설정한다.
예) 4의배수 개수는 3개이므로 temp = new int[3];

int[] arr = {44, 11, 29, 24, 76};
int[] temp = null;

int count = 0;
for (int i = 0; i < arr.length; i++) {
	if (arr[i] % 4 == 0 ) {
		count += 1;
	}
}

temp = new int[count];
int tempIndex = 0; // 그냥 i 증가값으로 돌려버리면 temp 배열 크기 이상 나와버림
for (int i = 0; i < arr.length; i++) {
	if (arr[i] % 4 == 0 ) {
		temp[tempIndex] = arr[i];
		tempIndex += 1;
	}
}
System.out.println(Arrays.toString(temp));

위의 문제 의도는 배열 인덱스에 관해 이해하고 있는지 묻는것 같다.
최종적으로 저장하고 싶은건 arr배열에 관한 값이므로 첫번째 for문에서 구한 temp의 크기는 이보다 작다.
당시 문제 풀때는 temp에 대한 인덱스를 구할 변수를 따로 또 구해줬는데 그냥 int tempIndex = 0;의 변수 생성 대신에 count 변수를 초기화 시켜서 사용해도 값은 같다... 같네?
이게 보이다니 발전했다 나 자신 장하다


문제3 영화관 좌석예매

  1. 사용자로부터 좌석번호(index)를 입력받아 예매하는 시스템이다.

  2. 예매가 완료되면 해당 좌석 값을 1로 변경한다.

  3. 이미 예매가 완료된 좌석은 재구매할 수 없다.

  4. 한 좌석당 예매 가격은 12000원이다.

  5. 프로그램 종료 후, 해당 영화관의 총 금액을 출력한다.
    예)
    seat = 0 0 0 0 0 0 0

    좌석선택 : 1
    seat = 0 1 0 0 0 0 0

    좌석선택 : 3
    seat = 0 1 0 1 0 0 0

    좌석선택 : 3
    seat = 0 1 0 1 0 0 0
    이미 예매가 완료된 자리입니다.
    총금액 : 24000원

Scanner sc = new Scanner(System.in);
int[] seats = new int[7]; 
int ticket = 12000;
int seat = 0;
int count = 0;
//		System.out.println(Arrays.toString(seats));
while (true) {
	System.out.println("영화 예매  / -1 입력시 종료");
	System.out.print("좌석 선택 : ");
	seat = sc.nextInt(); //인덱스
	if (seat == -1) {
		System.out.println("프로그램 종료");
		break;
	} 
	if (seats[seat-1] == 1) {
		System.out.println("이미 선점된 자리입니다.");
	} 
	
	for (int i = 0; i < seats.length; i++) {
		
		if (seats[seat-1] == 0) {
			seats[seat-1] = 1;
			count +=1;
			System.out.println(seat+"번 좌석 선택 ");
			System.out.println("seats : " + Arrays.toString(seats));
		} 
	}
	
	System.out.println("예매 현황 : " + Arrays.toString(seats)+"\n");
}

System.out.println("총 금액 " + (count * ticket) );

sc.close();

해당 배열에 인덱스 값이 있는지 확인 후 예매가 가능한지 불가능한지 사용자가 종료할때까지 반복해주면 되는 문제였다. 위의 문제들과 다른점은 특정 값 입력 전까지는 while문으로 계속 반복 가능하다는 점이다.


문제4 중복숫자 금지

[중복숫자 금지] 1. 0~4 사이의 숫자를 arr1배열에 저장한다. 2. 단, 중복되는 숫자는 없어야 한다. 힌트) 랜덤 숫자를
check배열의 인덱스로 활용한다.

[예]
랜덤숫자 : 1 check = {false, true, false, false, false} arr1 = {1, 0, 0, 0,
0}
랜덤숫자 : 3 check = {false, true, false, true, false} arr1 = {1, 3, 0, 0, 0}
랜덤숫자 : 2 check = {false, true, true, true, false} arr1 = {1, 3, 2, 0, 0}

Random rnd = new Random();

boolean[] check = new boolean[5]; // 선언만 하면 false
int[] arr = new int[5];

int rNum = 0;

int i = 0;
while (true) {
	rNum = rnd.nextInt(arr.length);
	if (i >= 5) {
		break;
	}
	if (check[rNum] == false) {
		check[rNum] = true;
		arr[i] = rNum;
		i += 1;
		System.out.println("랜덤숫자 : " + rNum);
		System.out.println(Arrays.toString(check));
	}
}

System.out.println("\n중복안되는 랜덤한 숫자 순서");
System.out.println(Arrays.toString(arr));

중복숫자금지 문제는 30분 붙잡다가 원하는 답이 안나와서 답을 봤는데 check 배열을 어떻게 써야할지 감이 안왔었다. 몇번 다시 풀다보니 index에 대한 변수가 필요함을 깨닫고 풀 수 있게 되었다.


문제5 회원가입 문제

회원가입(배열)
1. 추가

  • 인덱스 0번째부터 순차적으로 접근
  • 삭제했다가 새로 가입해도 순차적으로 들어와야함
  • 중복 안됨
  1. 수정
  • 수정 값 받아서 해당 값 수정
  • 중복안됨
  1. 삭제(인덱스)
  • 인덱스 값 입력받아 삭제
  • 삭제하고 인덱스 순서는 당겨져야함
    ex) {1, 2, 3, 4, 5} ===> 인덱스 입력: 2 ===> {1, 2, 4, 5, 0}
  1. 삭제(값)
  • 회원가입 값 삭제
  • 3과 같이 삭제하고 당겨져야함
  1. 삽입
  • 0이 있을 경우 순차적으로 삽입, 중간 삽입은 안됨
Scanner sc = new Scanner(System.in);
		
int[] members = { 0, 0, 0, 0, 0 };
int count = 0; //회원 수를 확인할 변수이자 회원의 인덱스번호
int select  = 0;
int data = 0;
int index = 0;
boolean check = false;
	while (true) {
	System.out.println("===[회원가입]===");
	System.out.println(Arrays.toString(members));
	System.out.println("현재 회원 수 : " + count);
	System.out.println("[1] 추가 / [2] 수정 / [3] 삭제(인덱스) / [4] 삭제(값) / [5] 삽입  / [0] 종료");
	select = sc.nextInt();
	if (select == 1) { // 추가
	if (count == 5) { // count가 5일 경우 --> 즉 배열에 모든 값이 들어간 경우
	System.out.println("회원수 최대");
	} else {
		System.out.print("[추가] 회원 입력 : ");
	data = sc.nextInt();
	// 유효성 검사
	check = false;
	for (int i = 0; i < count; i++) { // 배열의 크기가 아닌 카운트만큼 반복하면 쉽고 간편
	// 회원은 순차적으로 입력되어야함.
		if (members[i] == data) {
			check = true;
			break; 
		}
	}
	if (check == true) { // 중복값이 있는 경우
	System.out.println("이미 가입된 회원");
	} else { // 중복값이 없는 경우 추가
	members[count] = data;
	count += 1; 
	System.out.println("추가 성공");
			}
		}
		System.out.println();
	} else if (select == 2) { // 수정
	check = false;
	System.out.print("수정할 값 입력 : ");
	data = sc.nextInt();
	//				int index = -1; // 선생님 변수 초기값
	index = 0; // 어차피 값이 있을때 i번째 인덱스를 넣는다면 0이어도 되지 않을까 
				// --> 최종적으로 값 중복을 확인하고 대입하기때문에 0이어도 됨
	for (int i = 0; i < count; i++) { // 수정할 값 있는지 확인
	if (members[i] == data) {
		check = true;
		index = i; // 수정할 데이터 인덱스
		}
	}
	if (check == true) { // 수정할 값의 인덱스가 있을때 넘어옴
	System.out.println("[교체] 값 입력 : ");
	data = sc.nextInt();
	check = false;  // 유효성 검사를 위해 check값을 false로 초기화
	for (int i = 0; i < count; i++) {
		if(members[i] == data) { // 중복값 유효성 검사
		check = true; // 중복값이 있다면 다시 true로
			break;
		}
	}
	if (check == true) {
		System.out.println("중복값");
	} else { // 수정할 값이 중복이 아닐 경우
	members[index] = data;
	System.out.println("수정완료");
		}
	} else {
		System.out.println("수정값 없음");
		}
		System.out.println();
	} else if (select == 3) { // 삭제(인덱스)
	if (count == 0) { // 회원수가 0, 즉 없을때는 삭제 못함
	System.out.println("값이 비어있어 삭제 불가");
	continue; // 반복문의 현재 단계 중단 
	// --> while(true)의 무한루프에서 select 5일때 들어온 이 단계를 중단하고 다시 처음으로 돌아감
	}
	System.out.println("[삭제] 인덱스 입력 : ");
	index = sc.nextInt();
	
	// 삭제 index값 유효성 검사
	if (index < 0 || index >= count) { // 인덱스 범위 유효성 검사
	System.out.println("입력 오류");
	continue; // 반복문 현재 단계 중단
	}
	
	for (int i = index; i < count-1; i++) {
		members[i] = members[i + 1]; // 입력한 index부터 회원수까지 반복
	// i번째 번지에는 i번지 + 1의 값 대입
	// 반복은 배열 최대방수 -1만큼. 그래야 최대방수까지 접근해도 에러안남
	}
	members[count -1] = 0;  // -->현재 입력되어 있는 인덱스 크기-1 ==> 방값
	 // --> members 최대 인덱스 방값에 0 대입
	count -= 1; // 대입 끝내면 1 감소
	System.out.println("삭제완료");
		System.out.println();
	} else if (select == 4) { // 삭제(값)
	check = false; // 값 있는지 유효성 검사 변수
	index = 0; // 인덱스 찾아서 대입할 변수 초기화
	// index는 count가 0이면 그 아래 코드들은 실행안되니까 0으로 줘도 됨
	if (count == 0) {
		System.out.println("값이 비어있어 삭제 불가");
		continue;
	}
	System.out.print("삭제할 값 입력 : ");
	data = sc.nextInt();
	for (int i = 0; i < count; i++) { // 삭제할 값이 있는지 유효성 검사
	if (members[i] == data) { //삭제할 값은 배열 전체를 찾아야하므로 break를 주면 안됨
			check =true;
			index = i;
		}
	}
	
	if (check == true) { // 삭제할 값이 있으면 index를 구하고 check값이 true로 바껴 조건 성립
	for (int i = index; i < count -1; i++) {
		members[i] = members[i+1]; // i번째 값은 i번째 +1의 인덱스 값
	}
	members[count - 1] = 0;
	count -= 1;
	System.out.println("삭제 완료");
	} else { // 인덱스 삭제와 다르게 값 삭제는 해당 인덱스 값 위치가 주어지지 않으므로 구해야함
	System.out.println("삭제값 없음");
		}
		
		System.out.println();
	} else if (select == 5) { // 삽입
	check = false; // 삽입값이 중복인지 확인
	if (count == 5) { // 회원이 풀일때 삽입 불가
	System.out.println("가득참");
		continue;
	}
	System.out.print("삽입 인덱스 입력 : ");
	index = sc.nextInt();
	if (index < 0 || index > count) { // 인덱스 유효성 검사 , 입력한 index부터 반복 시작
	// 인덱스가 0보다 작거나(or) index가 count(회원수) 보다 크면 삽입이 실행되서는 안됨
	// 0번째 1번째 값이 있어도 2번째 값을 넣을거면 삽입보다 추가가 적절함
	System.out.println("인덱스 오류");
		continue;
	}
	System.out.print("[삽입] 값 입력 : ");
	data = sc.nextInt();
	for (int i = 0; i < count; i++) { // 삽입값 중복 유효성 검사
		if (members[i] == data) {
			check = true;
		}
	}
	if (check == true) {
		System.out.println("[삽입 값] 중복됨");
		continue;
	}
	int lastIndex = count; //삽입에서도 count 값으로 접근하되 자유롭게 값이 변경되어야 함
	for (int i = index; i < count; i++) { //입력한 index부터 시작
			members[lastIndex] = members[lastIndex-1];
			lastIndex -= 1;
		}
		members[index] = data;
		count += 1;
		
		System.out.println();
	} else if (select == 0) { //종료
	System.out.println("회원 추가 종료");
			System.out.println();
			break;
		}
}
sc.close();

위의 코드는 답안예시로 해설 강의도 없어서 처음에 뭔소리인지 이해가 안가 차근차근 코드를 뜯어봤다.
아래 코드는 답안예시를 보지 않았을때 혼자 시도했던 코드이다.

Scanner sc = new Scanner(System.in);

int[] members = { 0, 0, 0, 0, 0 };

int select = 0;
int id = 0;
int count = -1;
int indexTemp = 0;
int idTemp = 0;
int insertIndex = 0; 
boolean updateCheck = false;
//		boolean zeroCheck = false;
boolean check = false;
boolean close = false;
while (true) {
	System.out.println("===[회원가입]===");
	System.out.println(Arrays.toString(members));
	System.out.println("현재 회원 수 : " + (count+1));
	System.out.println("[1] 추가 / [2] 수정 / [3] 삭제(인덱스) / [4] 삭제(값) / [5] 삽입  / [0] 종료");
	select = sc.nextInt();
	if (select == 1) {
		System.out.print("가입할 아이디 입력 : ");
		id = sc.nextInt();
		for (int i = 0; i < members.length; i++) {
			if (count >= members.length-1) {
				close = true;
				break;
			}
			if (members[i] == 0 && close == false) { // 아이디가 없는 경우
				count += 1;
				check = true;
				break;
			} 
			if (members[i] == id && close == false) { // 아이디가 있는 경우
				check = false;
				break;
			}
		}
		
		if (check == false && close == false ) {
			System.out.println("이미 있는 아이디입니다.");
		} else if (check == true  && close == false) {
			members[count] = id;
			System.out.println("가입 완료!");
		} else if (close == true) {
			System.out.println("회원 선착순 마감");
		}
		System.out.println();
	} else if (select == 2) {
		check = false;
		updateCheck = true;
		System.out.print("기존에 있는 아이디 입력 : ");
		id = sc.nextInt();
		for (int i = 0; i < members.length; i++) { // 기존 아이디가 있는지 확인
			if (members[i] == id) {
				check = true;
				indexTemp = i;
				break;
			}
		}
		if (check == true) { // 기존 아이디가 있으면 바꿀 아이디가 중복값인지 확인
			System.out.print("바꿀 아이디 입력 : ");
			int updateId = sc.nextInt();
			for (int  i = 0; i < members.length; i++) {
				if (members[i] == updateId) {
					updateCheck = false;
					break;
				} 
			}
			if (updateCheck == true) {
				members[indexTemp] = updateId; 
				System.out.println("수정 완료!");
			} else if (updateCheck == false) {
				System.out.println("이미 있는 아이디 입니다.");
			}
		} else if (check == false) {
			System.out.println("존재하지 않는 아이디입니다.");
		}
		System.out.println();
	} else if (select == 3) {
		check = false;
		System.out.print("삭제할 인덱스값 입력 0~4 : ");
		int deleteIndex = sc.nextInt();
		for (int i = 0; i < members.length; i++ ) { //인덱스 있는지 검사
			if (count < -2) {
				System.out.println("삭제할 인덱스 없음");
				break;
			}
			if (i == deleteIndex && i != 0) { // 삭제를 0값으로 두었으므로 있으면 안됨
				check = true;
				indexTemp = i;
				break;
			} if (i == deleteIndex && i == 0) {
				check = true;
				indexTemp = i;
				break;
			}
		}
		System.out.println("check : " + check);
		if (check == true) { // 인덱스 있을 경우 
			// 11, 12, 13, 14, 15 --> 0번째 삭제시 --> 12, 13, 14, 15, 0
			for (int i = indexTemp; i < members.length-1; i++ ) {
				if (i < count) { // 카운트 미만
					idTemp = members[i];
					members[i] = members[i+1];
				} 
			}
			members[count] = 0;
			count -= 1; 
			System.out.println("삭제 완료");
		} else if (check == false) {
			System.out.println("해당 인덱스 없음");
		}
		System.out.println();
	} else if (select == 4) { // 배열 속성값으로 삭제하기
		check = false;
		System.out.print("삭제할 아이디 입력 : ");
		int deleteId = sc.nextInt();
		for (int i = 0; i < members.length; i++) {
			if(count < -2) {
				System.out.println("삭제할 회원 없음");
				break;
			}
			if (members[i] == deleteId && members[i] != 0) {
				check = true;
				indexTemp = i;
				break;
			}
		}
		// 11, 12, 13, 14, 15 --> 0번째 삭제시 --> 12, 13, 14, 15, 0
		if (check == true) { //아이디가 있을 경우 삭제
			for (int i = indexTemp; i < members.length-1; i++ ) {
				if (i < count) { // 카운트 미만
					idTemp = members[i];
					members[i] = members[i+1];
				} 
			}
			members[count] = 0;
			count -= 1; 
			System.out.println("삭제 완료");
		} else {
			System.out.println("해당 값 없음");
		}
		System.out.println();
	} else if (select == 5) {
		check = false; 
		System.out.println("값중복 초기값 : " + check);
		System.out.print("삽입할 id(값) 입력: ");
		int insertId = sc.nextInt();
		// 값 중복 확인
		for (int i = 0; i < members.length; i++) {
			if (members[i] == insertId) { // 조건에 뭘 줘야 걸릴까
				check = true;
				System.out.println("값중복 확인1 : " + check);
				System.out.println(i);
				break;
			} 
		}
		System.out.println("값중복 확인2 : " + check);
		if (check == false && count == 4) {  // 중복 id값이 없을때 1
			// 중복없으면서 count == 4일때 --> count 증가 x
//					System.out.println("회원수 최대");
			System.out.print("삽입할 위치(인덱스 0~4) 입력 : ");
			insertIndex = sc.nextInt();
			for (int i = members.length-1; i > indexTemp; i--) { // 삽입인덱스 위치에서 한칸씩 넘기기
				if (i <= members.length-1 && i >= insertIndex) {
					idTemp = members[i-1];
					members[i] = idTemp ;
				}
			}
			members[insertIndex] = insertId; // 입력 인덱스 위치에 입력 아이디 삽입
			System.out.println("삽입 완료");
		} else if (check == false && count < 4 && count > -2 ) { // 중복 id값이 없을때 2
			// 중복없으면서 count가 -1~3 --> count 증가 o
			System.out.print("삽입할 위치(인덱스 0~4) 입력 : ");
			insertIndex = sc.nextInt();
			//인덱스 위치 값이 비어있으면 그냥 삽입 아닐 경우 한칸씩 밀기
			if (members[insertIndex] == 0) {
				members[insertIndex] = insertId;
			} else {
				for (int i = members.length-1; i > insertIndex; i--) { //한칸씩 밀기 구현끝
					if (i <= members.length-1 && i >= insertIndex) {
						idTemp = members[i-1];
						members[i] = idTemp;
					}
				}
				members[insertIndex] = insertId;
			}
			
			System.out.println("삽입 완료");
			count += 1;
		} else if (check ==false) {
			System.out.println("이미 있는 아이디 입니다.");
		}
		System.out.println();
	} else if (select == 0) {
		System.out.println("종료\n");
		break;
	}
}
System.out.println("최종 회원 : " + Arrays.toString(members));
sc.close();

해당 코드 문제점
1. 이렇게 코드가 길어질때는 인덱스 값에 대한 변수 따로 빼기

  • 라고 생각했으나 그냥 회원수를 세어주는 변수를 쓰면 됐었다. 회원수에 따라 값이 변하는 범위에 대한 효율적인 변수가 있었는데 '아, 배열이니까 무조건 length로 반복문 범위만큼 돌아야해!' 편견으로 코드 작성했다가 가독성도 나쁘고 효율도 안좋았다.
  1. 배열 증가값에 대한 변수 따로 빼기
  • 이건 회원수에 따라 값이 변하는 변수로 해결이 가능했다.
  1. 임시로 사용할 변수명 통일하기
  • 예를들어 indexTemp와 tempMember라는 인덱스와 멤버에 대한 임시저장변수가 있다는 가정하에 temp를 맨 뒤로 쓰도록 통일하자
  1. 이 방식은 회원 자리가 없음을 나타내는 0들의 인덱스 자리에 삽입을 하면 추가, 삭제에 문제가 생김
  • {0,0,0,0,0} 의 인덱스 2자리에 삽입을 해버리면 추가,삭제에 문제가 생긴다.
  • 이는 내가 문제를 잘못 이해해서 발생한 문제이다.
  1. 일반적으로 회원은 순차적으로 입력해야함
  • 4와 연관된 것으로 회원가입할때는 순차적이어야한다. 눈으로 0이라는 값이 보이니 당연히 입력 가능할거란 생각에 접근이 잘못되었다.
  1. 회원이 없을때는 삽입이 안됨
  • 4,5와 연관이 있다. 0이라면 순차적으로 삽입(추가)가 되어야한다.

4~6번을 보아 접근부터 잘못된 슬픈 케이스...

문제를 보고 내가 할수있는 만큼 코드를 작성하다가 최하단 코드처럼 엉망진창이 됐다.
배열과 좀 안친했던 것도 있었고 그동안 삭제랑 추가를 하면 리스트에서 사이즈가 줄었다 늘었다하니 사이즈만 뽑아내면 됐던거에 비해 배열은 고정된 범위이니 생각해야될게 많았다. 결국은 나의 미숙이지 뭐 허허
요 문제는 하루하고도 반나절동안 인덱스와 씨름하며 붙잡고 있었다. 혼자서 에러를 해결하고 혼자서 풀어보고 접근해보고, 그리고 이 문제를 이해하고 안보고 풀 수 있을만큼 처음 문제 접했을때와 같은 시간을 들였다.

코드를 쭉 써보고 답안예시를 보니 답안예시가 훨씬 효율적이고 틀에 박힌 사고를 부수는 좋은 기회가 되었다.

0개의 댓글