코드스테이츠 백엔드 부트캠프 8일차 [java 기초-4]

wish17·2022년 12월 24일
0
post-thumbnail

[SEB BE] Section 1 - [Java] 기초

배열(Array)

개요

각 값들이 같은 타입을 가지는 경우, 배열을 사용하면 여러 개의 변수를 선언하지 않고도 단 하나의 변수만으로 값들을 저장하고 참조할 수 있다.


배열이란?

배열이란, 동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다.

배열의 차원이란?

배열이 중첩된 정도를 의미한다.
배열이 중첩되었다 함은, 배열의 요소가 또 다른 배열인 경우를 의미한다.

  • 1차원 배열 : 배열이 중첩이 없는 경우 = 배열의 요소가 배열이 아닌 경우

    • ex) { 1, 2, 3, 4 }
  • 2차원 배열 : 배열이 한 번 중첩된 경우 = 배열의 요소가 배열인 경우

    • ex) { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } }

1차원 배열

1차원 배열의 선언과 초기화

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로 배열의 길이(크기)를 얻을 수 있다.


2차원 배열

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][];

Quiz

5
문자열을 입력받아 문자열을 구성하는 각 단어를 요소로 갖는 배열을 리턴하라.

  • 반복문(for, while) 사용은 금지
  • 단어는 공백 한 칸으로 구분
  • 연속된 공백은 없다고 가정

나의 풀이

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(" ");
  } 
}
  1. 배열을 입력받아 가장 큰 요소를 리턴하라.

나의 풀이

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;
  }
  1. 배열과 요소를 입력받아 주어진 요소를 배열의 맨 앞에 추가하고 해당 배열을 리턴하라.
  • 주어진 요소가 추가된 형태의 배열을 리턴해야 함
  • [arr[0], arr[1], ..., arr[n-1], el] 형태
  • arr.length는 n // <<이건 문제에 왜 있는지 모르것음
  • 반복문(for, while) 사용은 금지

나의 풀이

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.copyOfArrays.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')

  • String 타입을 리턴하라.
  • 반복문(for, while) 사용은 금지
  • 배열의 길이가 8인 경우, 앞에 [0, 1, 0]이 있다고 가정
  • 배열의 길이는 8 또는 11

나의풀이

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 문자열

  • 메소드가 어떤 타입을 인풋받고 어떤타입으로 반환하는지 확실히 아는게 중요한 것 같다.

0개의 댓글