인덱스 2개를 입력받아 값 교체하기
예 1) 인덱스1 입력 : 1 , 인덱스2 입력 : 3
{10, 40, 30, 20, 50}
값 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));
[조건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
변수를 초기화 시켜서 사용해도 값은 같다... 같네?
이게 보이다니 발전했다 나 자신 장하다
사용자로부터 좌석번호(index)를 입력받아 예매하는 시스템이다.
예매가 완료되면 해당 좌석 값을 1로 변경한다.
이미 예매가 완료된 좌석은 재구매할 수 없다.
한 좌석당 예매 가격은 12000원이다.
프로그램 종료 후, 해당 영화관의 총 금액을 출력한다.
예)
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문으로 계속 반복 가능하다는 점이다.
[중복숫자 금지] 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에 대한 변수가 필요함을 깨닫고 풀 수 있게 되었다.
회원가입(배열)
1. 추가
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. 이렇게 코드가 길어질때는 인덱스 값에 대한 변수 따로 빼기
4~6번을 보아 접근부터 잘못된 슬픈 케이스...
문제를 보고 내가 할수있는 만큼 코드를 작성하다가 최하단 코드처럼 엉망진창이 됐다.
배열과 좀 안친했던 것도 있었고 그동안 삭제랑 추가를 하면 리스트에서 사이즈가 줄었다 늘었다하니 사이즈만 뽑아내면 됐던거에 비해 배열은 고정된 범위이니 생각해야될게 많았다. 결국은 나의 미숙이지 뭐 허허
요 문제는 하루하고도 반나절동안 인덱스와 씨름하며 붙잡고 있었다. 혼자서 에러를 해결하고 혼자서 풀어보고 접근해보고, 그리고 이 문제를 이해하고 안보고 풀 수 있을만큼 처음 문제 접했을때와 같은 시간을 들였다.
코드를 쭉 써보고 답안예시를 보니 답안예시가 훨씬 효율적이고 틀에 박힌 사고를 부수는 좋은 기회가 되었다.