[java] 반복문, 배열 문제

·2022년 9월 9일
0

TIL

목록 보기
6/8
post-thumbnail

문자열의 숫자값 구하는 법

getNumbericValue

String str = "12345";

char ch = str.charAt(i);
int num = Character.getNumbericValue(ch);

if ( i == 0 ) {
	return num;     // num = 1;
  } else if ( i == 4) {
    return num;      // num = 5;
  }

문자열 문자 바꾸는 법

replace(from, to)

String str = "loop";

str = str.replace('o', 'e');

return str;   // str = "leep";

배열 복사

Arrays.copyOf(원본 배열, 복사할 길이)

arr2 = Arrays.copyOf(arr2, arr2.length + 1);
arr2는 arr2를 arr2의 길이에 1 더한 만큼 복사한 값이다. 

arr 배열의 짝수 요소만 갖는 배열 리턴.

int[] arr2 = new int[]{};

    if(arr.length == 0) {
      return new int[]{};
    }

    for(int i = 0; i < arr.length; i++) {
      if(arr[i] % 2 == 0) {
        arr2 = Arrays.copyOf(arr2, arr2.length + 1);
        arr2[arr2.length - 1] = arr[i];
      }
    }
    return arr2;

System.arraycopy(src, srcPos, dest, destPos, length)

src - 복사할 배열
srcPos - 복사할 배열의 복사 시작 위치
dest - 복사 붙여넣기되는 배열
destPost - 복사 붙여넣기되는 배열의 복사 시작 위치
length - 복사할 요소의 개수

배열과 요소를 입력받아 주어진 요소를 배열의 맨 앞에 추가하고 해당 배열을 리턴해야 합니다.

public class Solution { 
	public int[] addToFront(int[] arr, int el) {
    // TODO:
    int[] arr2 = new int[arr.length+1];
    
    // arr2의 길이는 el과 arr배열의 요소를 포함하기 때문에 arr의 길이에 el를 추가한 만큼의 길이를 가진다.
    
    arr2[0] = el;


    System.arraycopy(arr, 0, arr2, 1, arr.length);
    //arr 배열에 0번째 인덱스부터 복사, arr2 1번째 인덱스부터 붙여넣기 -> arr.length만큼 복사
    
    return arr2;
	} 

새 배열 리턴

getElementsAfter

배열과 인덱스를 입력받아 주어진 인덱스 이후의 요소들을 갖는 새로운 배열을 리턴해야 합니다.

public class Solution { 
	public int[] getElementsAfter(int[] arr, int n) {
    int[] arr2 = new int[arr.length-n];
    
    if ((arr.length == 0)||(n>arr.length)) {
      return new int[]{};
    } else {
    System.arraycopy(arr, n, arr2, 0, arr.length-n);
    return arr2; }
	} 
}

arr = {4}
n = 11을 넣었을 때, 빈 배열을 리턴해야 하는데 'java.lang.NegativeArraySizeException' 에러가 발생했다.
if문에 따라 빈 배열을 리턴해야 하는거 아냐?

💡 'java.lang.NegativeArraySizeException'는 배열의 길이가 음수일 때 발생하는 에러

arr2를 선언할 때 이미 arr2의 길이를 arr.length-n으로 정해놨기 때문에 arr2의 길이는 1-11 = -10 음수로 선언되어 발생한 오류였다.

public class Solution { 
	public int[] getElementsAfter(int[] arr, int n) {
  
    
    if ((arr.length == 0)||(n>arr.length)) {
      return new int[]{};
    } else {
	int[] arr2 = new int[arr.length-n];
    System.arraycopy(arr, n, arr2, 0, arr.length-n);
    return arr2; }
	} 
}

arr2 선언을 if문에 하니 문제 해결

레퍼런스 : Arrays.copyOfRange(arr, from, to)

arr : 원본 배열
from : 원본 배열을 인덱스 from부터 복사(from번째 포함)
to : 원본 배열을 인덱스 to전까지 복사(to번째 미포함)

public class Solution { 
	public int[] getElementsAfter(int[] arr, int n) {
    if (n >= arr.length) {
			return new int[]{};
		}

		int[] result = Arrays.copyOfRange(arr, n, arr.length);
		return result;
	} 
}

createPhoneNumber

0-9 사이의 정수를 요소로 갖는 배열을 입력받아 전화번호 형식의 문자열을 리턴해야 합니다.

public class Solution { 
	public String createPhoneNumber(int[] arr) {
    // TODO: head if(arr.length == 8){arr[0]~arr[2]}else if(arr.length==11){010}
    // middle(arr.length-8~arr.length-5) tail(arr.length-4~arr.length-1)
   //head
   String head = "010";
   if(arr.length == 11){
     String headArr = Arrays.toString(Arrays.copyOfRange(arr, 0, 3));
     head = headArr.replaceAll(" ", "").replaceAll(",", "").replace("[","").replace("]","");
   }
  
  //middle
  String midArr = Arrays.toString(Arrays.copyOfRange(arr, arr.length-8, arr.length-4));
  String middle = midArr.replace("[","").replaceAll(",","").replace("]","").replaceAll(" ", "");
  
  //tail
  String tailArr = Arrays.toString(Arrays.copyOfRange(arr, arr.length-4, arr.length));
  String tail = tailArr.replace("[","").replaceAll(",","").replace("]","").replaceAll(" ", "");

    return String.format("(%s)%s-%s", head, middle, tail);
	} 
}


분명 풀었던 문제였는데 하루 지나고 보니 어질어질.
나 괜찮을까..?

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글