각 값들이 같은 타입을 가지는 경우, 배열을 사용하면 여러 개의 변수를 선언하지 않고도 단 하나의 변수만으로 값들을 저장하고 참조할 수 있다.
배열이란, 동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다.
배열이 중첩된 정도를 의미한다.
배열이 중첩되었다 함은, 배열의 요소가 또 다른 배열인 경우를 의미한다.
1차원 배열 : 배열이 중첩이 없는 경우 = 배열의 요소가 배열이 아닌 경우
2차원 배열 : 배열이 한 번 중첩된 경우 = 배열의 요소가 배열인 경우
double[] temperatureOfJuly;
temperatureOfJuly = new double[31];
double[] temperatureOfJuly = new double[31];
double[] temperatureOfJuly = new double[] { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };
= 배열_참조_변수_이름.length
로 배열의 길이(크기)를 얻을 수 있다.
int[][] kcal;
kcal = new int[31][3];
int[][] kcal = new int[31][3];
int[][] kcal = new int[][] {
{ 1982, 2098, 2130 },
{ 2242, 2431, 2198 },
{ 2365, 1997, 1932 },
...
{ 2278, 2391, 2006 }
};
배열이 2차원 이상일 때, 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며, 이러한 배열을 가변 배열이라고 한다.
int[][] ages = new int[5][];
5
문자열을 입력받아 문자열을 구성하는 각 단어를 요소로 갖는 배열을 리턴하라.
나의 풀이
public class Solution {
public String[] getAllWords(String str) {
String[] arr={};
if(str.length()==0) {
return arr;
}else {
return str.split(" ");
}
}
}
입력은 문자열 출력은 문자열로 구성된 배열이다.
입력도 배열이라고 생각해서 equals로 하려다 한참을 헤맸다.
문제를 똑바로 읽자...
ans
public class Solution {
public String[] getAllWords(String str) {
if (str.isEmpty()) {
return new String[]{};
}
return str.split(" ");
}
}
나의 풀이
public class Solution {
public int getLargestElement(int[] arr) {
int result=0;
for(int i=1; i<arr.length; i++){
if(arr[i-1]<arr[i]){
result = arr[i];
}
if(arr[0]>result){
result = arr[0];
}
}
return result;
}
}
비슷한 방식이지만 답안이 조금 더 깔끔하다.
ans
public class Solution {
public int getLargestElement(int[] arr) {
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
}
int 타입를 요소로 갖는 배열을 입력받아 짝수만을 요소로 갖는 배열을 리턴하라.
나의 풀이
import java.util.Arrays;
public class Solution {
public int[] getEvenNumbers(int[] arr) {
int a = 0;
for(int j=0; j<arr.length; j++) {
if(arr[j]%2==0){
a++;
}
}
int [] result = new int[a];
int b = 0;
for(int i=0; i<arr.length; i++) {
if(arr[i]%2==0){
result[b] = arr[i];
b++;
}
}
return result;
}
}
답안을 보면
Arrays.copyOf(원본배열, 복사할 길이)
를 이용해 배열의 길이를 조절할 수 있다. (0번 요소부터 선택한 길이까지 순서대로 복사함)
ans
import java.util.Arrays;
public class Solution {
public int[] getEvenNumbers(int[] arr) {
int[] concatArray = new int[]{};
if(arr.length == 0) {
return new int[]{};
}
for(int i = 0; i < arr.length; i++) {
if(arr[i] % 2 == 0) {
concatArray = Arrays.copyOf(concatArray, concatArray.length + 1);
concatArray[concatArray.length - 1] = arr[i];
}
}
return concatArray;
}
[arr[0], arr[1], ..., arr[n-1], el]
형태나의 풀이
package com.codestates.coplit;
public class Solution {
public int[] addToFront(int[] arr, int el) {
int[] result = new int[arr.length+1]; // 정답 배열 생성
result[0] = el; // 맨앞(0번 인덱스)에 el 추가
System.arraycopy(arr, 0, result, 1, arr.length); // 그 뒤에 arr 복붙
//System.arraycopy(source 배열, source 인덱스, dest 배열, dest 인덱스, 복사할 개수)
// [Source] 배열의 [source 인덱스]에서부터 [복사할 개수] 만큼의 요소들을 [dest 배열]의 [dest 인덱스]에서부터 붙여라.
return result;
}
}
ans 똑같음 System.arraycopy()
때문에 적었음
arraycopy 설명
17
배열과 인덱스를 입력받아 해당 인덱스의 요소를 제외한 배열을 리턴하라.
// 이 상태에서 고민함
import java.util.*;
public class Solution {
public int[] getAllElementsButNth(int[] arr, int n) {
int[] aa ={};
if(arr.length<n) {
return arr;
}else if (arr.length ==0) {
return aa;
}else{
int[] result = new int[arr.length-1];
result = Arrays.copyOf(arr,n);
result = Arrays.copyOfRange(arr,n,arr.length-1);
return result;
}
}
}
Arrays.copyOf
와Arrays.copyOfRange
가 덮는 방식인걸 모르고 안돼서 한참 고민했다.
나의 풀이
import java.util.*;
public class Solution {
public int[] getAllElementsButNth(int[] arr, int n) {
int[] aa ={};
if(arr.length<n) {
return arr;
}else if (arr.length ==0) {
return aa;
}else{
int[] arr2 = new int[arr.length-1];
System.arraycopy(arr,0,arr2,0,n);
System.arraycopy(arr,n+1,arr2,n,arr.length-n-1);
return arr2;
}
}
}
for문을 이용해 간단하게 가능하다.
ans
import java.util.*;
public class Solution {
public int[] getAllElementsButNth(int[] arr, int n) {
if (n >= arr.length) {
return arr;
}
int[] result = new int[arr.length - 1];
int index = 0;
for (int i = 0; i < arr.length; i++) {
if (i == n) {
continue;
}
result[index] = arr[i];
index++;
}
return result;
}
}
0-9 사이의 정수를 요소로 갖는 배열을 입력받아 전화번호 형식의 문자열을 리턴하라. (ex. '(010)1234-5678')
나의풀이
import java.util.Arrays;
public class Solution {
public String createPhoneNumber(int[] arr) {
String result ="";
if(arr.length ==8){
result = Arrays.toString(arr);
result = result.replaceAll("[^0-9]",""); // 문자열에서 숫자만 남기기
result = "(010)"+result.substring(0, 4)+"-"+result.substring(4, 8);
return result;
}else {
result = Arrays.toString(arr);
result = result.replaceAll("[^0-9]",""); // 문자열에서 숫자만 남기기
result = "("+result.substring(0, 3)+")"+result.substring(3, 7)+"-"+result.substring(7, 11);
// result라는 String의 0이상 3미만 인덱스를 가져온다. + 3이상 7미만 인덱스를 가져온다...
}
return result;
}
}
숫자만 남은 문자열로 변환 후 부분을 나눠서 진행했는데
답지는 부분을 나누고 변환했다.
ans
import java.util.Arrays;
public class Solution {
public String createPhoneNumber(int[] arr) {
String head = "010";
int len = arr.length;
String bodyArr = Arrays.toString(Arrays.copyOfRange(arr, len - 8, len - 4));
String body = bodyArr
.replaceAll(" ", "")
.replaceAll(",", "")
.replace("[", "")
.replace("]", "");
String tailArr = Arrays.toString(Arrays.copyOfRange(arr, len - 4, len));
String tail = tailArr
.replaceAll(" ", "")
.replaceAll(",", "")
.replace("[", "")
.replace("]", "");
if (len == 11) {
String headArr = Arrays.toString(Arrays.copyOfRange(arr, 0, 3));
head = headArr
.replaceAll(" ", "")
.replaceAll(",", "")
.replace("[", "")
.replace("]", "");
}
return String.format("(%s)%s-%s", head, body, tail);
}
}
int형 array는 ==
연산자로 비교가 가능하지만 배열의 요소가 아닌 Heap 영역의 주소 값을 비교하게 되므로 무조건 false가 나온다.
(배열비교는 무조건 Arrays.equals(intArray1, intArray2)
쓰자)
str.length()
문자열의 길이 (문자열 to int)
arr.length
배열의 길이 (배열 to int)
str.charAt(i)
str 문자열의 i번째 인덱스 요소값 (문자열 to 문자)
str.split(" ")
공백을 기준을 문자열을 나눠서 배열로 저장 (문자열 to 배열)
Arrays.copyOf(원본배열, 복사할 길이)
배열을 복사해 배열로 반환(0번 요소부터 선택한 길이만큼 순서대로 복사함) 쌓이는 방식x 덮는방식임,
원본배열보다 더 길게 설정도 가능한데 초과부분은 int형의 경우 0으로 채워지고 String형은 null로 채워진다. (배열 to 배열)
Arrays.copyOfRange(원본 배열, 복사할 시작인덱스, 복사할 끝인덱스)
이걸 쓰면 인덱스 기준으로 복사도 가능하다. (배열 to 배열)쌓이는 방식x 덮는방식임
System.arraycopy(source 배열, source 인덱스, dest 배열, dest 인덱스, 복사할 개수)
[Source] 배열의 [source 인덱스]에서부터 [복사할 개수] 만큼의 요소들을 [dest 배열]의 [dest 인덱스]에서부터 붙여라.
(배열 to 배열)
Arrays.toString(arr)
arr배열을 String으로 변환 (배열 to 문자열)
str.replace
, str.replaceAll("%","-")
%를 -로 바꿔라 (문자열 to 문자열)
str.replaceAll("[^0-9]","")
숫자만 남기고 특수문자 다 삭제 (문자열 to 문자열)
str.substring(0, 3)
문자열의 인덱스값 0이상 3미만 출력 (문자열 to 문자열