188. 주사위 게임 3
import java.util.*;
class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 0;
int equals = 1;
int[] numbers = new int[4];
numbers[0] = a;
numbers[1] = b;
numbers[2] = c;
numbers[3] = d;
Arrays.sort(numbers);
int[] dice = new int[6];
for(int i=0; i<4; i++){
dice[numbers[i]-1]++;
}
for(int i=0; i<6; i++){
if(dice[i] == 4){
answer = 1111 * (i+1);
break;
} else if(dice[i] == 3){
for(int j=0; j<6; j++){
if(dice[j] == 1){
answer = (10 * (i+1) + (j+1)) * (10 * (i+1) + (j+1));
break;
}
}
} else if(dice[i] == 2){
for(int j=0; j<6; j++){
if(dice[j] == 2){
if(i==j){
continue;
} else{
answer = (i+1 + j+1) * Math.abs((i+1) - (j+1));
break;
}
} else if(dice[j] == 1){
equals = equals * (j+1);
}
} if(equals != 1){
answer = equals;
}
} else if(numbers[0] != numbers[1] && numbers[1] != numbers[2] &&
numbers[2] != numbers[3]){
answer = numbers[0];
}
}
return answer;
}
}
<작성한 코드>
두 개의 주사위가 같을 때 곱을 저장하는 역할을 하기 위해 생성하고 1을 대입해 줬다. 그 뒤 int형 배열 numbers에 a, b, c, d의 값을 차례대로 넣어주고 Arrays.sort를 이용해서 오름차순 정렬을 시켜줬다. 그 뒤 dice에 길이를 6만큼 선언한 뒤 numbers [i-1] 즉 주사위의 값을 가진 인덱스에 ++를 해줬다. 그다음 for문을 사용해서 조건을 정리해 줬다. 만약 4개가 같은 수이면 dice [i] 값이 4인값 1개와 나머지는 0으로 채워져 있을 거다. dice의 값이 4인 게 있으면 1111 * (i+1)을 해주고 for문을 멈춘다. 4가 아니라 3 일시에는 숫자가 다른 1개의 값을 찾는다. 찾아서 조건에 맞춰 값을 answer에 넣어주고 for문을 멈춘다. 만약 2개의 값이 같다면 숫자가 다른 두 값을 구해야 한다. dice가 2일 때는 i=j가 같을 때 반복문을 다시 실행하도록 했고, dice [j]가 1이라면 그 값을 equals에 곱해준다. 만약 아니라면 dice가 2개가 같은 값일 때의 조건에 맞는 값을 answer에 넣어주고 반복문을 종료시켰다. 마지막으로 equals이 1이 아니라면 answer에 equals값을 대입해 줬다. 값이 모두 다를 때는 answer에 네 개의 값 중 아무거나 넣으면 된다. 난 0번째 값을 넣어줬다. 마지막으로 answer을 반환해 줬다
189. 간단한 논리연산
class Solution {
public boolean solution(boolean x1, boolean x2, boolean x3, boolean x4) {
boolean answer = true;
answer = ((x1 || x2) && (x3 || x4));
return answer;
}
}
<작성한 코드>
간단한 문제였다. x1, x2는 or연산을 해주고 x3과 x4도 or연산을 해준 뒤 두 값을 앤드연산으로 비교해 주고 answer에 대입해 줬다.
190. 배열 만들기 4
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> list = new ArrayList<>();
int i = 0;
while(arr.length > i){
if(list.size() == 0){
list.add(arr[i]);
i++;
} else{
if(list.get(list.size()-1) < arr[i]){
list.add(arr[i]);
i++;
}else{
list.remove(list.size()-1);
}
}
}
int[] stk = new int[list.size()];
for(int j=0; j<list.size(); j++){
stk[j] = list.get(j);
}
return stk;
}
}
<작성한 코드>
list를 하나 만들어줬다. 그리고 while문을 사용해서 arr의 길이가 i보다 크면 반복하도록 했다. 우선 list의 길이가 0이면 list에 arr [i]를 더해주고 i++를 해줬다. 만약 길이가 0이 아니라면 else내부의 if, else문이 실행된다. list의 마지막 원소값이 arr [i]보다 작다면 list에 arr [i] 값을 추가해 줬다. 만약 작지 않고 크거나 같다면 list의 마지막원소를 제거해 줬다. 그 뒤 정수형 배열 stk를 list의 길이만큼 선언해 준 뒤 list의 값을 넣어주고 반환하였다.
191. 콜라츠 수열 만들기
import java.util.*;
class Solution {
public int[] solution(int n) {
List<Integer> list = new ArrayList<>();
list.add(n);
while(n != 1){
if(n%2 == 0){
n = n/2;
} else{
n = 3 * n + 1;
}
list.add(n);
}
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
<작성한 코드>
리스트 하나를 만들어준 뒤 처음값도 포함해야 하니 list.add(n)을 해주고 while문을 시작했다. 짝수라면 n/2 홀수라면 3n+1을 해주고 그 값들을 차례차례 list에 넣어줬다. 그 뒤 n이 1이 되면 while문은 종료된다. 그 뒤 for문으로 list의 값들을 answer에 대입해 주면 끝난다.
192. 카운트 업
class Solution {
public int[] solution(int start_num, int end_num) {
int[] answer = new int[end_num - start_num + 1];
for(int i=0; i<answer.length; i++){
answer[i] = i+start_num;
}
return answer;
}
}
<작성한 코드>
간단한 문제였다. answer의 길이를 선언해 주고 answer에 길이만큼 반복문을 돌린 뒤 answer [i] 내부에 i+start_num 값을 넣어주고 반환하였다.
193. 배열 만들기 2
import java.util.*;
class Solution {
public int[] solution(int l, int r) {
List<Integer> list = new ArrayList<>();
for(int i=l; i<=r; i++){
String str = Integer.toString(i);
if(str.matches("[05]+")){
list.add(i);
}
}
if(list.size() == 0){
return new int[]{-1};
}
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
<작성한 코드>
list를 하나 만들어줬다. 그 뒤 l부터 r까지 반복해 주고 i를 문자열로 변환하였다. 그 뒤 정규 표현식으로 0,5로만 이루어진 수를 만나면 list에 추가해 줬다. for문이 끝난 뒤 list의 길이가 0이면 -1을 반환한다. 0이 아니라면 answer에 list의 값들을 넣어주고 반환하였다.
194. 수열과 구간 쿼리 4
class Solution {
public int[] solution(int[] arr, int[][] queries) {
for(int i=0; i<queries.length; i++){
int s = queries[i][0];
int e = queries[i][1];
int k = queries[i][2];
for(int j=s; j<=e; j++){
if(j%k == 0) arr[j]++;
}
}
return arr;
}
}
<작성한 코드>
간단한 문제다. 중첩 for문을 사용하였고 첫 for문에서는 queries의 길이만큼 반복해 준다. s, e, k에 각각 맞는 값을 대입해 준 뒤 j는 s부터 e까지 반복시켰다. 내부에서는 if문을 사용해서 j% k==0일 때 즉 j가 k의 배수일 때 arr [j]에 +1을 해주고 arr를 반환하였다.
195. 수열과 구간 쿼리 2
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[][] queries) {
int[] answer = new int[queries.length];
Arrays.fill(answer, Integer.MAX_VALUE);
for(int i=0; i<queries.length; i++){
for(int j=queries[i][0]; j<=queries[i][1]; j++){
if(arr[j] > queries[i][2]){
answer[i] = Math.min(answer[i], arr[j]);
}
}
if(answer[i] == Integer.MAX_VALUE) answer[i] = -1;
}
return answer;
}
}
<작성한 코드>
answer배열의 길이를 queries의 길이만큼 선언해 준 뒤 Arrays.fill을 사용해서 answer의 모든 원소를 max_value로 설정해 주었다. 그 뒤 반복문으로 queries의 길이만큼 반복시켜 주고 내부에서는 queries의 [i][0] 번째부터 [i][1] 번째까지 반복해 줬다. 만약 arr [j]의 값이 queries [i][2]의 값보다 크다면 answer [i]에 answer [i]와 arr [j] 중 작은 것을 대입한다. 반복된다면 queries [i][2]보다 큰 arr [j]의 값들 중 가장 작은 값이 answer [i]에 넣어질 것이다. 그 뒤 if문에서는 아무 값도 들어가지 않아 값이 초기값 그대로인 Integer.MAX_VALUE이면 answer [i]에는 -1을 넣어줬다.
196. 수열과 구간 쿼리 3
class Solution {
public int[] solution(int[] arr, int[][] queries) {
for(int i=0; i<queries.length; i++){
int temp = arr[queries[i][0]];
arr[queries[i][0]] = arr[queries[i][1]];
arr[queries[i][1]] = temp;
}
return arr;
}
}
<작성한 코드>
간단한 문제였다. 자리만 바꿔주면 되니 temp를 사용해서 인덱스에 들어있는 값을 변경해 줬다.
'프로그래머스 문제풀이 > 알고리즘 (JAVA)' 카테고리의 다른 글
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (206~214번 문제풀이) (1) | 2023.10.20 |
---|---|
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (197~205번 문제풀이) (1) | 2023.10.19 |
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (178~187번 문제풀이) (1) | 2023.10.19 |
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (170~177번 문제풀이) (0) | 2023.10.18 |
[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (162~169번 문제풀이) (0) | 2023.10.18 |
남건욱's 공부기록