[프로그래머스] n의 배수 고르기

Drumj·2023년 3월 10일
0

문제


첫번째 접근

배열 numlist가 주어지고 구해야 하는 배수 n도 주어진다.

이때 n의 배수만 담긴 result라는 배열을 반환 해줘야 한다.

그래서 나는 result의 배열 길이를 구하기 위해 int m을 지정 해줬다.

아래 코드에 주석을 남겨뒀으니 코드로 살펴보자

int n = 3; // n의 배수
int[] numlist = {4, 5, 6, 7, 8, 9, 10, 11, 12};
int m = 0; // 되돌려줄 배열 길이 알아야 함.

for (int i = 0; i < numlist.length; i++) {
	if (numlist[i] % n == 0) {
		numlist[m] = numlist[i]; // n의 배수로 numlist 0부터 m-1번째 인덱스 값 변경
		m++; // m 크기 늘리기
	}
}
int[] answer = new int[m]; // 결정된 m의 크기로 배열 생성
for (int i = 0; i < m; i++) {
	answer[i] = numlist[i]; // 배열에 값 집어넣기
}

for를 두개나 써서 풀었다. answer에 값을 넣으려고 했지만 m이 확정되지 않아서 바로 넣을 수 없었다...

int n = 3; // n의 배수
int[] numlist = {4, 5, 6, 7, 8, 9, 10, 11, 12};
int m = 0; // 되돌려줄 배열 길이 알아야 함.
int[] answer = new int[m];

for (int i = 0; i < numlist.length; i++) {
	if (numlist[i] % n == 0) {
		answer[m] = numlist[i];
		m++;
	}
}

원래는 이렇게 코드를 짯으나 index 에러로 실패..! 그래서 int[] answer를 m이 다 결정난 이후로 내려준거다..

이렇게 제출을 하고 나니
아!!!!! 배열 길이도 정해졌고 numlist에 값을 담아뒀잖아?!?!
라는 생각이 들었다.


두번째 풀이

위와 똑같은 코드에서 for를 하나 덜 사용했다.
바로 ArrayscopyOfRange를 사용하는것

int n = 3; // n의 배수
int[] numlist = {4, 5, 6, 7, 8, 9, 10, 11, 12};
int m = 0; // 되돌려줄 배열 길이 알아야 함.

for (int i = 0; i < numlist.length; i++) {
	if (numlist[i] % n == 0) {
    numlist[m] = numlist[i]; // n의 배수로 numlist 0부터 m-1번째 인덱스 값 변경
    m++; // m 크기 늘리기
    }
}

int[] answer = Arrays.copyOfRange(numlist, 0, m);

많이 짧아지긴 했으나 위에 for 문은 여전히 사용된다..
아직 내 지식으로는 위의 for문도 간단하게 바꾸는걸 모르겠다..

여튼 중요한 건 배열을 배열로 옮길 때 copyOfRange를 사용하는 방법도 있다~~~ 이말이야.


마무으리

일단 간단하게 문제를 풀어보고 더 효율적인 코드가 있는지 항상 생각하는 힘을 기르자.

알고는 있는데 못써먹고 지나갔다가 아차!! 하고 생각나는 경우가 많다.

그래도 아차!! 하고 생각났으니 괜찮다고 본다.
아예 모르고 지나가는 것 보다는 낫지

0개의 댓글