29-java - 배열 문제들_2

jin·2022년 7월 2일
0

1. 같은 수 삭제 문제

input[] = {1,3,3,2,1,1,4};

[1] input 의 데이터를 a 에 순차적으로 저장한다.
[2] 단, 저장할려는 숫자의 앞의 숫자가 지금 저장할려는 수와 값이 같다면,
둘다 삭제한다.
예) input = {1,3,3,2,1,1,4}
1 ==> a[] = {1}
3 ==> a[] = {1,3}
3 ==> a[] = {1,3,3} ==> {1}
2 ==> a[] = {1,2}
1 ==> a[] = {1,2,1}
1 ==> a[] = {1,2,1,1} ==> {1,2}
4 ==> a[] = {1,2,4}

int input[] = { 1, 3, 3, 2, 1, 1, 4 };
int a[] = new int[input.length];
int count = 0;
for (int i = 0; i < input.length; i++) {
	if (count == 0) {
		a[count] = input[i];
		count++;
	} else if (input[i] == a[count-1]) {
		a[count -1] = 0;
		count --;
	} else {
		a[count] = input[i];
		System.out.println(Arrays.toString(a));
		count++;
	}
}
System.out.println(Arrays.toString(a));

접근을 어떻게 할지 감이 오지않아 헤맸던 문제

2. 같은 수 합치기 문제

input = {8,4,2,2,4,4,8};

[1] input 의 데이터를 순차적으로 a에 저장한다.
[2] 저장할려는 수와 그앞의 수가 서로같으면 합친다. (계속 중첩적용)
input = {8,4,2,2,4,4,8}
8 ==> a[] = {8}
4 ==> a[] = {8,4}
2 ==> a[] = {8,4,2}
2 ==> a[] = {8,4,2,2} ==> {8,4,4} ==> {8,8} ==> {16}
4 ==> a[] = {16,4}
4 ==> a[] = {16,4,4} ==> {16,8}
8 ==> a[] = {16,8,8} ==> {16,16} ==> {32}

int [] input = { 8, 4, 2, 2, 4, 4, 8 };	
int a[] = new int[input.length];	
int index = 0;

for (int i = 0; i < input.length; i++) {
	a[index] = input[i];
	while (true) {
		System.out.println(Arrays.toString(a));
		if (index == 0) {
			break;
		}
		if (a[index] == a[index-1]) {
			a[index] = 0;
			a[index-1] *= 2;
			index--;
		} else {
			break;
		}
	}
	index++;
}

같은 수이므로 해당 수에 * 2 하면 해결되는 문제였는데
2 ==> a[] = {8,4,2,2} ==> {8,4,4} ==> {8,8} ==> {16}
위의 경우 각기 반복문을 이용하여 다르게 처리하려고 하다보니 접근법이 잘못되어 오래걸린 문제

3. 두개 뽑아 더하기

[1] arr 배열에서 숫자 2개씩 뽑아서 더한값을 차례대로 result 에 저장후출력
[2] 자기차례 인덱스의 값은 더하지않는다.
(1) [인덱스 0] 의값 2 + (1,3,4,1) ==> 2 + 1 , 2 + 3 , 2 + 4 , 2 + 1
(2) [인덱스 1] 의값 1 + (2,3,4,1) ==> 1 + 2 , 1 + 3 , 1 + 4 , 1 + 1
(3) [인덱스 2] 의값 3 + (2,1,4,1) ==> 3 + 2 , 3 + 1 , 3 + 4 , 3 + 1
....

Random rnd = new Random();
int arr[]  = {2,1,3,4,1};

int result [] = new int[100];

int index=0;

for (int i = 0; i < arr.length; i++) {
	System.out.printf("[인덱스 %d] 의 값 : %d\n", i, arr[i]);
	for (int j = 0; j < arr.length; j++) {
		if (i == j) {
			continue;
		}
		result[index] = arr[i] + arr[j];
		System.out.printf("%d + %d  ", arr[i], arr[j]);
		index++;
		
	}
	System.out.println();
}
System.out.println();
System.out.printf("%d, ",result[i]);

문제에서 난수를 두개 받아 구하는줄 알고 코드를 작성하다가 예시에서 이상함을 느끼고 확인했다. 자신을 제외한 수만 더해주면 됐던 문제

4. 세로 출력

yList 의 값들은 data 의 세로 인덱스를 뜻한다.
yList의 값들이 가르키는 세로줄을 출력

예) yList[0] = 1 ==> 0,0,2,1,4,1,1
예) yList[1] = 3 ==> 0,0,0,0,0,0,3
예) yList[2] = 2 ==> 0,0,0,3,2,4,4

int data[][] = {
	    {0,0,0,0,0},
		{0,0,0,0,3},
		{0,2,0,0,3},
		{3,1,3,0,1},
		{1,4,2,0,2},
		{4,1,4,0,4},
		{2,1,4,3,3},
};		
int[] yList = { 1, 3, 2, 2, 0, 1 };
for (int i = 0; i < yList.length; i++) {
	int index = yList[i];
	for (int j = 0; j < data.length; j++) {
		System.out.printf("%d ", data[j][index]);
	}
	System.out.println();
}

이중 반복문을 이해하고 있는지 묻는 문제로 큰 어려움은 없었다.

5. 세로 출력의 max

data 배열의 각 세로줄의 합을 sumList 에 저장후 가장 큰값을 출력

int data[][] = {
	    {0,0,0,0,0},
		{0,0,0,0,3},
		{0,2,0,0,3},
		{3,1,3,0,1},
		{1,4,2,0,2},
		{4,1,4,0,4},
		{2,1,4,3,3},
};		
int[] sumList = { 0, 0, 0, 0, 0};

for (int i = 0; i < sumList.length; i++) {
	for (int j = 0; j < data.length; j++) {
		sumList[i] += data[j][i];
	}
}
System.out.println(Arrays.toString(sumList));
int max = 0;
for (int i = 0; i < sumList.length; i++) {
	if (max < sumList[i]) {
		max = sumList[i];
	}
}
System.out.println("최대값 : " + max );

4번 세로출력의 응용버전

6. 순서 찾기

input 의 배열안의 값들이 array배열의 값들과 일치하고, 그순서도 일치하면 true , 아니면 false 출력

예) input1의 값들은 6,1,8 이고 array 의
index 5~7(6,1,8) 의 값과 순서가 일치한다.
결과) true

예) input2의 값들을 array 배열에 있는값들과 일치하지만,
input2 순서가 6,3 이고, array 의 값은 3,6 으로 순서가 다르다.
결과) false

int array[] = { 1, 3, 3, 6, 5, 6, 1, 8, 9 };
int input1[] = { 6, 1, 8 };
int input2[] = { 6, 3 };

int index = 0;
boolean check = false;
for (int i = 0; i < array.length; i++) {
	if (input1[index] != array[i]) {
		index = 0;
		continue;
	}
	index++;
	if (index == input1.length) {
		check = true;
		break;
	} 
}
System.out.println(check);
System.out.println();
check = false;
index = 0;
for (int i = 0; i < array.length; i++) {
	if (input2[index] != array[i]) {
		index = 0;
		continue;
	}
	index++;
	if (index == input2.length) {
		check = true;
		break;
	}
}
System.out.println(check);

이 문제에 대한 평을 얘기하기 전, 우리 강의는 1,2,3그룹으로 나눠져있었다. (현재 1,2그룹) 1그룹은 테스트 패스, 2,3그룹은 매일 테스트를 봤었는데 옆자리 동기가 어떻게 푸는지 물어봤던 문제 그 당시에는 많이 다르게 풀었었다.

int arr[] = {1,3,3,6,5,6,1,8,9};	
int input1[] = {6,1,8};
int input2[] = {6,3};

boolean check1 = false;
boolean check2 = false;

int loop = arr.length - input1.length;

for (int i = 0; i <= loop; i++ ) {
	int index1 =0;
	int index2 = 0;
	if (input1[index1] == arr[i] && input1[index1+1] == arr[i+1] && input1[index1+2] == arr[i+2]) {
		check1 = true;
	} 
	if (input2[index2] == arr[i] && input2[index2+1] == arr[i+1]) {
		check2 = true;
	} 
}


System.out.println(check1);
System.out.println(check2);

반복해야할 횟수를 구한다음 풀었는데 뭔가 깨달음이 온건지 맞는 배열6 파트에서 다시 마주치니 좀 다르게 풀렸다. 좀 더 심플한 방법이 있을거 같은데 시간되면 해보는걸로

7. 인풋쇼핑

nameList 배열은 상품이름리스트 ,
dataList 2차원배열은 각각 가격 , 상품개수 리스트목록이다 .
예) 현재 재고는 새우깡은 3개 , 감자깡 1개 , 고래밥 1개 있다.
아래 배열은 오늘 주문이 들어온순서이다.
총매출을 출력해보세요.

예) 첫번째 1 ==> 감자깡의 개수는 1이므로 판매할수있다.
예) 두번째 2 ==> 고래밥의 개수는 1이므로 판매할수있다.
예) 세번째 2 ==> 고래밥의 개수가 이미 두번째에서 구입해서 0이되므로 판매불가.
....
....
주문은 총 새우깡 2개 , 감자깡 3개 , 고래밥 3개 들어왔지만 ,
실제 판매한 품목은 새우깡 2개 , 감자깡 1개 , 고래밥 1개 이다.

String titleList[] = {"새우깡" , "감자깡" , "고래밥"};
int dataList[][] = {
		{1000, 3},
		{2300, 1},
		{3100, 1}
};
int [] input = {1,2,2,0,0,2,1,1};

int index = 0;
int sum = 0;
for (int i = 0; i < input.length; i++) {
	index = input[i];
	if (dataList[index][1] == 0) {
		System.out.println(titleList[index]+" 재고 없음");
		continue;
	}
	System.out.printf("판매 %s , 가격 %d",titleList[index],dataList[index][0]);
	sum += dataList[index][0];
	dataList[index][1] --;
	System.out.println();
	
}
System.out.println();
System.out.println("총매출 : " + sum);

재고가 있으면 2차원 배열에 재고에 해당하는 부분을 하나씩 감소해주고 재고가 없으면 넘어가면 됐던 문제, 이차원 배열 재고에 해당하는 인덱스를 고정해야하는지 묻는 문제였다.

8. 숫자 이동 게임

[숫자이동게임]
move = {1,0,0,0,8,0,0,0,1};
[1] move 안의 8은 플레이어이다
[2] move 안의 0은 이동할수있는 길이다.
[3] move 안의 1은 이동할수없는 벽이다.

input 배열의 내용을 순차적으로 실행하고,결과출력하시오.
input의값중 1은 왼쪽이동 , 2는 오른쪽이동이다.
벽에서 이동하면, "이동할수없습니다" 출력
시작=> {1,0,0,0,8,0,0,0,1};
1 ==> {1,0,0,8,0,0,0,0,1};
1 ==> {1,0,8,0,0,0,0,0,1};
1 ==> {1,8,0,0,0,0,0,0,1};
1 ==> "이동할수없습니다"
2 ==> {1,0,8,0,0,0,0,0,1};
2 ==> {1,0,0,8,0,0,0,0,1};
2 ==> {1,0,0,0,8,0,0,0,1};

int move[] = { 1, 0, 0, 0, 8, 0, 0, 0, 1 };
int input[] = { 1, 1, 1, 1, 2, 2, 2 };

int index = 0;
for (int i = 0; i <move.length; i++) {
	if (move[i] == 8) {
		break;
	}
	index++;
}
for (int i = 0; i < input.length; i++) {
	if (input[i] == 1) {
		if (move[index-1] == 1) {
			System.out.println(move[index-1]+" 이동불가");
			continue;
		}
		move[index] = 0;
		index--;
		move[index] = 8;
	} else {
		if (move[index+1] == 1) {
			System.out.println(move[index]+"이동불가");
			continue;
		}
		move[index] = 0;
		index++;
		move[index] = 8;
	}
	System.out.println(Arrays.toString(move));
}

지금까지 비슷한 문제들을 풀어와서 큰 어려움이 없었다. 왼쪽, 오른쪽에 해당하는 인덱스를 이해하는지 묻는 문제

0개의 댓글