
조건에 맞게 수열 변환하기2
정수 배열 arr가 주어집니다.
arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다.
이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.
import java.util.*;
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] copyArr = {};
while (!Arrays.equals(arr, copyArr)) {
copyArr = Arrays.copyOf(arr, arr.length);
for(int i = 0; i < copyArr.length; i++){
int num = copyArr[i];
// 원소 >= 50 && 짝수 -> 원소 / 2
if(num % 2 == 0 && num >= 50){
arr[i] = num / 2;
// 원소 < 50 && 홀수 -> 원소 * 2 + 1
} else if(num % 2 != 0 && num < 50) {
arr[i] = num * 2 + 1;
}
}
answer++;
};
answer -= 1;
return answer;
}
}
1. 두 배열의 동등할 때까지 반복한다
2. 각 요소에 대해 조건에 맞게 변경한다
3. 두 배열이 동등하지 않으면 반복하고, 두 배열이 동등하면 반복 횟수에서 -1을 차감한다
JAVA 배열 동등성 비교
- 동일성(identity)
- 같은 인스턴스를 참조하고 있을 경우 동일
- 동등성(equality)
- 인스턴스의 값들이 같을 경우 동등
- equals() : 동등성 비교
- 배열 : Arrays.equals(배열1, 배열2)
- 문자열 : 문자열1.equals(문자열2)
import java.util.*;
public class Main {
public static void main(String[] args) {
String[] str1 = {"dadf","wfgg"};
String[] str2 = Arrays.copyOf(str1, str1.length);
System.out.println(str1[0].equals(str2[0])); //true
System.out.println(str1.equals(str2)); //false
System.out.println(Arrays.equals(str1,str2)); //true
}
}
flag 사용해서 성능 개선
- 동등성 비교시 두 배열의 요소만큼 비교해야 하기 때문에 비교문이 반복적으로 수행되어 성능 저하가 올 수 있다
- 변경 플래그 사용시 조건문과, 플래그 갱신만 수행하기 때문에 배열 비교에 비해 성능이 좋아진다
import java.util.*;
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] copyArr = Arrays.copyOf(arr, arr.length);
boolean flag;
do {
flag = false;
for(int i = 0; i < copyArr.length; i++){
int num = copyArr[i];
// 원소 >= 50 && 짝수 -> 원소 / 2
if(num % 2 == 0 && num >= 50){
arr[i] = num / 2;
// 원소 < 50 && 홀수 -> 원소 * 2 + 1
} else if(num % 2 != 0 && num < 50) {
arr[i] = num * 2 + 1;
}
if(arr[i] != copyArr[i]) {
flag = true;
}
}
copyArr = Arrays.copyOf(arr, arr.length);
answer++;
} while(flag);
answer -= 1;
return answer;
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 20 함수(메서드) (0) | 2024.08.22 |
---|---|
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 17 문자열 (0) | 2024.08.10 |
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 14 리스트(배열) (0) | 2024.08.04 |
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 9 문자열 (0) | 2024.07.25 |
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 8 조건문, 문자열 (4) | 2024.07.25 |

조건에 맞게 수열 변환하기2
정수 배열 arr가 주어집니다.
arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다.
이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.
import java.util.*;
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] copyArr = {};
while (!Arrays.equals(arr, copyArr)) {
copyArr = Arrays.copyOf(arr, arr.length);
for(int i = 0; i < copyArr.length; i++){
int num = copyArr[i];
// 원소 >= 50 && 짝수 -> 원소 / 2
if(num % 2 == 0 && num >= 50){
arr[i] = num / 2;
// 원소 < 50 && 홀수 -> 원소 * 2 + 1
} else if(num % 2 != 0 && num < 50) {
arr[i] = num * 2 + 1;
}
}
answer++;
};
answer -= 1;
return answer;
}
}
1. 두 배열의 동등할 때까지 반복한다
2. 각 요소에 대해 조건에 맞게 변경한다
3. 두 배열이 동등하지 않으면 반복하고, 두 배열이 동등하면 반복 횟수에서 -1을 차감한다
JAVA 배열 동등성 비교
- 동일성(identity)
- 같은 인스턴스를 참조하고 있을 경우 동일
- 동등성(equality)
- 인스턴스의 값들이 같을 경우 동등
- equals() : 동등성 비교
- 배열 : Arrays.equals(배열1, 배열2)
- 문자열 : 문자열1.equals(문자열2)
import java.util.*;
public class Main {
public static void main(String[] args) {
String[] str1 = {"dadf","wfgg"};
String[] str2 = Arrays.copyOf(str1, str1.length);
System.out.println(str1[0].equals(str2[0])); //true
System.out.println(str1.equals(str2)); //false
System.out.println(Arrays.equals(str1,str2)); //true
}
}
flag 사용해서 성능 개선
- 동등성 비교시 두 배열의 요소만큼 비교해야 하기 때문에 비교문이 반복적으로 수행되어 성능 저하가 올 수 있다
- 변경 플래그 사용시 조건문과, 플래그 갱신만 수행하기 때문에 배열 비교에 비해 성능이 좋아진다
import java.util.*;
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] copyArr = Arrays.copyOf(arr, arr.length);
boolean flag;
do {
flag = false;
for(int i = 0; i < copyArr.length; i++){
int num = copyArr[i];
// 원소 >= 50 && 짝수 -> 원소 / 2
if(num % 2 == 0 && num >= 50){
arr[i] = num / 2;
// 원소 < 50 && 홀수 -> 원소 * 2 + 1
} else if(num % 2 != 0 && num < 50) {
arr[i] = num * 2 + 1;
}
if(arr[i] != copyArr[i]) {
flag = true;
}
}
copyArr = Arrays.copyOf(arr, arr.length);
answer++;
} while(flag);
answer -= 1;
return answer;
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 20 함수(메서드) (0) | 2024.08.22 |
---|---|
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 17 문자열 (0) | 2024.08.10 |
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 14 리스트(배열) (0) | 2024.08.04 |
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 9 문자열 (0) | 2024.07.25 |
[프로그래머스 : JAVA] 코딩 기초 트레이닝 Day 8 조건문, 문자열 (4) | 2024.07.25 |