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));
접근을 어떻게 할지 감이 오지않아 헤맸던 문제
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}
위의 경우 각기 반복문을 이용하여 다르게 처리하려고 하다보니 접근법이 잘못되어 오래걸린 문제
[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]);
문제에서 난수를 두개 받아 구하는줄 알고 코드를 작성하다가 예시에서 이상함을 느끼고 확인했다. 자신을 제외한 수만 더해주면 됐던 문제
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();
}
이중 반복문을 이해하고 있는지 묻는 문제로 큰 어려움은 없었다.
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번 세로출력의 응용버전
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 파트에서 다시 마주치니 좀 다르게 풀렸다. 좀 더 심플한 방법이 있을거 같은데 시간되면 해보는걸로
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차원 배열에 재고에 해당하는 부분을 하나씩 감소해주고 재고가 없으면 넘어가면 됐던 문제, 이차원 배열 재고에 해당하는 인덱스를 고정해야하는지 묻는 문제였다.
[숫자이동게임]
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));
}
지금까지 비슷한 문제들을 풀어와서 큰 어려움이 없었다. 왼쪽, 오른쪽에 해당하는 인덱스를 이해하는지 묻는 문제