본문 바로가기
일지/취준일기

2024_12_12 취준일기 16일차

by 알케니브 2024. 12. 12.

오늘의 계획

1. 코드 공부

내용

 

 


2. 프로그래머스 코딩 테스트

문제1.

정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.

변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.

  • 만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.

위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.

 

제한사항: 1 ≤ arr의 길이 ≤ 100,000

  • 1 ≤ arr의 원소 ≤ 100,000

입출력 예

arr result
[1, 4, 2, 5, 3] [1, 2, 3]
  • 입출력 예 #1: 각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
i arr[i] stk
0 1 []
1 4 [1]
2 2 [1, 4]
2 2 [1]
3 5 [1, 2]
4 3. [1, 2, 5]
4 3 [1, 2]
- - [1, 2, 3]
  • 라서 [1, 2, 3]을 return 합니다.
class Solution {
    public int[] solution(int[] arr) {
        int[] stk = {};
        return stk;
    }
}

 

풀이과정

:

 

정답

import java.util.ArrayList;
class Solution {
    public int[] solution(int[] arr) {
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < arr.length; i++) {
            if (list.isEmpty()) {
                list.add(arr[i]);
            } else if (list.get(list.size() - 1) < arr[i]) {
                list.add(arr[i]);
            } else {
                list.remove(list.size() - 1);
                i--;
            }
        }
        int[] stk = new int[list.size()];
        int index = 0;
        for (int i = 0; i < list.size(); i++) {
            stk[index++] = list.get(i);
        }
        
        return stk;
    }
}

 

++ 다른사람의 풀이


 

문제2.

boolean 변수 x1x2x3x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.

  • (x1 ∨ x2) ∧ (x3 ∨ x4)

입출력 예

x1 x2 x3 x4 result
false true true true true
true false false false false
  • 입출력 예 #1: 예제 1번의 x1x2x3x4로 식을 계산하면 다음과 같습니다.
    ( x1 ∨ x2) ∧ (x3 ∨ x4) ≡ (F ∨ T) ∧ (T ∨ T) ≡ T ∧ T ≡ T
    라서 true를 return 합니다.
  • 입출력 예 #2: 예제 2번의 x1x2x3x4로 식을 계산하면 다음과 같습니다.
    ( x1 ∨ x2) ∧ (x3 ∨ x4) ≡ (T ∨ F) ∧ (F ∨ F) ≡ T ∧ F ≡ F
    라서 false를 return 합니다.
  • 과 ∧의 진리표는 다음과 같습니다.
    |
    x|y|x ∨ y|x ∧ y|
    | ---|---|---|---|
    |T|T|T|T|
    |T|F|T|F|
    |F|T|T|F|
    |F|F|F|F|

class Solution {
    public boolean solution(boolean x1, boolean x2, boolean x3, boolean x4) {
        boolean answer = true;
        return answer;
    }
}

 

풀이과정

:

 

정답

class Solution {
    public boolean solution(boolean x1, boolean x2, boolean x3, boolean x4) {
        boolean answer = (x1 || x2) && (x3 || x4);

        return answer;
    }
}

 

++ 다른사람의 풀이

 


문제3.

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다

  • 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
  • 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
  • 사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
  • 느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
  • 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

주사위를 굴렸을 때 나온 숫자가 정수 매개변수 abcd로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

 

제한사항: a bcd는 1 이상 6 이하의 정수입니다.

입출력 예

a b c d result
2 2 2 2 2222
4 1 4 4 1681
6 3 3 6 27
2 5 2 6 30
6 4 2 5 2
  • 입출력 예 #1: 예제 1번에서 네 주사위 숫자가 모두 2로 같으므로 1111 × 2 = 2222점을 얻습니다. 따라서 2222를 return 합니다.
  • 입출력 예 #2: 예제 2번에서 세 주사위에서 나온 숫자가 4로 같고 나머지 다른 주사위에서 나온 숫자가 1이므로 (10 × 4 + 1)2 = 412 = 1681점을 얻습니다. 따라서 1681을 return 합니다.
  • 입출력 예 #3: 예제 3번에서 ad는 6으로, bc는 3으로 각각 같으므로 (6 + 3) × |6 - 3| = 9 × 3 = 27점을 얻습니다. 따라서 27을 return 합니다.
  • 입출력 예 #4: 예제 4번에서 두 주사위에서 2가 나오고 나머지 다른 두 주사위에서 각각 5, 6이 나왔으므로 5 × 6 = 30점을 얻습니다. 따라서 30을 return 합니다.
  • 입출력 예 #5: 예제 5번에서 네 주사위 숫자가 모두 다르고 나온 숫자 중 가장 작은 숫자가 2이므로 2점을 얻습니다. 따라서 2를 return 합니다.

 



풀이과정

아니 이거 너무 노가다코드아냐... 일단 다 적음...ㅋㅋㅋ

class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 0;
        
        // 첫번째 케이스
        if (a == b && b == c && c == d) {
            answer = 1111 * a;
            
        // 두번째 케이스
        } else if (a == b) {
            if (b == c && c != d) {
                answer = (10 * a + d) * (10 * a + d);
            } else if (b == d && c != d) {
                answer = (10 * a + c) * (10 * a + c);
            }
        } else if (b == c) {
            if (a != b && c == d) {
                answer = (10 * b + a) * (10 * b + a);
            }
        } else if (c == d) {
            if (a == c && b != c) {
                answer = (10 * a + b) * (10 * a + b);
            }
        }    
        // 세번째 케이스    
        else if (a == b && c == d && a != c) {
            answer = (a + c) * (a - c);
        } else if ((a == c && b == d && a != b) || (a == d && b == c && a != b)) {
            answer = (a + b) * (a - b);
        } 
        
        // 네번째 케이스
        else if (a == b && b != c && c != d) {
            answer = c * d;
        } else if (a == c && b != c && b != d) {
            answer = b * d;
        } else if (a == d && a != b && b != c) {
            answer = b * c;
        } else if (b == c && a != b && a != d) {
            answer = a * d;
        } else if (b == d && a != b && c != a) {
            answer = a * c;
        } else if (c == d && a != c && a != b) {
            answer = a * b;
        }
        
        // 다섯번째 케이스
        else if (a != b && b != c && c != d) {
            answer = Math.min(Math.min(a, b), Math.min(c, d));
        } 
                   
        return answer;
    }
}

이렇게 했는데 자꾸 [6, 3, 3, 6]의 케이스에서 틀리다고 하길래 뭔가.. 했더니 음수가 나와서 문제가 되었나보다

근데 아무리 해도 자꾸 틀렸다고 하길래 계속 이거저거 해보다가 혹사나 하고 else if 안에서 나눈것을 지우고 다 else if로만 통일시켰더니 됐다...

 

정답

class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 0;
        
        // 첫번째 케이스
        if (a == b && b == c && c == d) {
            answer = 1111 * a;
            
        // 두번째 케이스
        } else if (a == b && b == c && c != d) {
            answer = (10 * a + d) * (10 * a + d);
        } else if (a == b && b == d && c != d) {
            answer = (10 * a + c) * (10 * a + c);
        } else if (b == c && a != b && c == d) {
            answer = (10 * b + a) * (10 * b + a);
        } else if (c == d && a == c && b != c) {
            answer = (10 * a + b) * (10 * a + b);
        }    
        // 세번째 케이스    
        else if (a == b && c == d ) {
            answer = (a + c) * (Math.abs(a - c));
        } else if (a == c && b == d ) {
            answer = (a + b) * (Math.abs(a - b));
        } else if (a == d && b == c) {
            answer = (a + b) * (Math.abs(a - b));
        } 
        
        // 네번째 케이스
        else if (a == b && c != d) {
            answer = c * d;
        } else if (a == c && b != d) {
            answer = b * d;
        } else if (a == d && b != c) {
            answer = b * c;
        } else if (b == c && a != d) {
            answer = a * d;
        } else if (b == d && c != a) {
            answer = a * c;
        } else if (c == d && a != b) {
            answer = a * b;
        }
        
        // 다섯번째 케이스
        else if (a != b && b != c && c != d) {
            answer = Math.min(Math.min(a, b), Math.min(c, d));
        } 
                   
        return answer;
    }
}

++ 다른사람의 풀이

import java.util.Arrays;

class Solution {
    public int solution(int a, int b, int c, int d) {

        int[] dice = { a, b, c, d };
        Arrays.sort(dice);

        int ans = 0;

        if (dice[0] == dice[3]) {
            ans = 1111 * dice[3];
        } else if (dice[0] == dice[2] || dice[1] == dice[3]) {
            ans = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);
        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {
            ans = (dice[0] + dice[3]) * (dice[3] - dice[0]);
        } else if (dice[0] == dice[1]) {
            ans = dice[2] * dice[3];
        } else if (dice[1] == dice[2]) {
            ans = dice[0] * dice[3];
        } else if (dice[2] == dice[3]) {
            ans = dice[0] * dice[1];
        } else {
            ans = dice[0];
        }

        return ans;
    }
}

케이스를 분리하는 방법이라고 한다. 훨씬 깔끔해보임


문제4.

제한사항: 

입출력 예

  • 입출력 예 #1
  • 입출력 예 #2

 



풀이과정

:

 

 

 



정답

 

 

++ 다른사람의 풀이


문제5.

제한사항: 

입출력 예

  • 입출력 예 #1
  • 입출력 예 #2

 



풀이과정

:

 

 

 



정답

 

 

++ 다른사람의 풀이

 


3. 이력서/지원/면접 준비 활동

'일지 > 취준일기' 카테고리의 다른 글

2024_12_19 취준일기 18일차  (1) 2024.12.19
2024_12_16 취준일기 17일차  (0) 2024.12.16
2024_12_11 취준일기 15일차  (0) 2024.12.11
2024_12_09 취준일기 14일차  (3) 2024.12.09
2024_12_05 취준일기 13일차  (0) 2024.12.05