100세까지 코딩
[프로그래머스] Lv0.주사위 게임 본문
문제 설명

풀기 전 생각
- 4개의 숫자를 배열에 넣어 오름차순으로 정렬하기
- 반복문을 돌려 i와 i+1을 비교해서 같으면 same ++ 하고 sameValue에 값 넣기
- 이전 sameValue가 0이 아니고 현재 값과 다르면 중복이 2개라는 표시하기
- 앞과 비교해서 다르면 이전 중복 값과 현재 값이 비교,
같으면 arr[i+1]을 differentValue에 넣고 그 이외에는 arr [i]를 differentValue에 넣기 - same과 twoSameValue로 경우를 나눠 게임 방식대로 계산

class Solution {
public int solution(int a,int b, int c, int d) {
int[] arr = {a, b, c, d};
int answer = 0;
int same = 0; // 중복이 나온 횟수
int sameValue = 0; // 중복 값
int differentValue = 0; // 다른 것의 값
int twoSameValue = 0; // 22,44 처럼 중복인게 2개인것
Arrays.sort(arr); // Array를 써서 정렬
for(int i = 0; i < arr.length-1; i++) {
if(arr[i] == arr[i+1]) { // 앞과 비교
same++; // 중복이니깐 same + 1
if(sameValue!=arr[i] && sameValue!=0){ // 이전 중복 값이 지금 값과 다르고 이전 값이 없지 않으면
twoSameValue++; // 22, 44 처럼 중복이 2개인것
}
sameValue = arr[i]; // 중복 값 넣기
}else {
if(sameValue == arr[i]){ // 이전 중복 값이 현재와 같으면
differentValue = arr[i+1]; // 중복에서 다음으로 넘어가는거니깐 다음 값이 다른값 ex) 2234에서 2->3
}else {
differentValue = arr[i]; // 그렇지않으면 지금이 다른값
}
}
}
if(same == 3){ // 3쌍의 중복값이 나오면 4개 다 동일 ex) 2222
answer = sameValue * 1111;
}else if(same == 2 && twoSameValue == 0 ){ // 2쌍의 중복 값과 중복 값 자체가 2개는 아님 ex) 2223
answer = (10*sameValue + differentValue)*(10*sameValue + differentValue);
}else if(same == 2 && twoSameValue == 1 ){ // 2쌍의 중복 값과 중복 값 자체가 2개 ex) 2233
answer = (arr[0] + arr[3]) * Math.abs(arr[0]-arr[3]);
}else if(same == 1) { // 1쌍의 중복값 ex) 1223
answer = 1; // 곱하기 위함
for(int i = 0; i < arr.length; i++) {
if(arr[i] != sameValue){ // 중복 값이 아닌 것들만 곱해주기
answer *= arr[i];
}
}
}else { // 4개의 숫자가 다 다른것 ex) 1234
answer = arr[0]; // 가장 작은 숫자 반환
}
return answer;
}
}
오류 및 개선
- 오류는 없었지만 중간 중간에 경우 나누기가 헷갈렸음
- 조잡하다는 느낌을 받음
- 정렬한 배열의 규칙을 찾아 경우를 다 나눠 새로 코드를 짜봄
- 모범 코드도 새로 짠 코드와 비슷
최종
class Solution {
public int solution(int a,int b, int c, int d) {
int[] arr = {a, b, c, d};
int answer = 0;
Arrays.sort(arr); // Array를 써서 정렬
if (arr[0] == arr[3]) { // 정렬 후 처음과 끝이 같으면 4개 다 같음
answer = 1111 * arr[3];
} else if (arr[0] == arr[2] || arr[1] == arr[3]) { // 1번째 == 3번쨰 || 2번째 == 4번째 3개가 같은 것
answer = (int) Math.pow(arr[1] * 10 + (arr[0] + arr[3] - arr[1]), 2);
} else if (arr[0] == arr[1] && arr[2] == arr[3]) { // 1번째 == 2번째 && 3번째 == 4번째 2개 2개 같은 것
answer = (arr[0] + arr[3]) * (arr[3] - arr[0]);
} else if (arr[0] == arr[1]) { // 1번째 == 2번째 하나만 같은 것
answer = arr[2] * arr[3];
} else if (arr[1] == arr[2]) { // 2번째 == 3번째 하나만 같은 것
answer = arr[0] * arr[3];
} else if (arr[2] == arr[3]) { // 3번째 == 4번째 하나만 같은 것
answer = arr[0] * arr[1];
} else { // 그 이외는 같은 것이 하나도 없는 것
answer = arr[0];
}
return answer;
}
}
간단하게 생각하자!
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.코드 처리하기 (0) | 2023.08.27 |
---|---|
[프로그래머스] Lv0.배열 조각하기 (0) | 2023.08.27 |
[프로그래머스] Lv0.정수를 나선형으로 배치하기 (0) | 2023.08.25 |
[프로그래머스] Lv0.OX퀴즈 (0) | 2023.08.18 |
[프로그래머스] Lv0.유한소수 판별하기 (0) | 2023.08.18 |