오늘의 계획
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 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 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번의 x1, x2, x3, x4로 식을 계산하면 다음과 같습니다.
( x1 ∨ x2) ∧ (x3 ∨ x4) ≡ (F ∨ T) ∧ (T ∨ T) ≡ T ∧ T ≡ T
따라서 true를 return 합니다. - 입출력 예 #2: 예제 2번의 x1, x2, x3, x4로 식을 계산하면 다음과 같습니다.
( 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점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한사항: a , b, c, d는 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번에서 a, d는 6으로, b, c는 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 |