조건문
수 조작하기 1
🗒️ 정수 n
과 문자열 control
이 주어집니다. control
은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control
의 앞에서부터 순서대로 문자에 따라 n
의 값을 바꿉니다.
- "w":
n
이 1 커집니다. - "s":
n
이 1 작아집니다. - "d":
n
이 10 커집니다. - "a":
n
이 10 작아집니다.
위 규칙에 따라 n
을 바꿨을 때 가장 마지막에 나오는 n
의 값을 return 하는 solution 함수를 완성해주세요.
class Solution {
public int solution(int n, String control) {
char[] arr = control.toCharArray();
for (char c : arr) {
switch (c) {
case 'w': n++; break;
case 's': n--; break;
case 'd': n += 10; break;
case 'a': n -= 10; break;
}
}
return n;
}
}
🔎 switch문: 값이 정해진 것들 중 하나일 때
switch (변수) {
case 값1: ...
break;
case 값2: ...
break;
...
default: ...
break;
}
// 향상된 switch문
String result = switch (score) {
case "D" -> {
System.out.println("Too low");
yield "Bad";
}
case "C", "B" -> "Okay";
case "A" -> "Good";
default -> "Unknown";
};
마지막 두 원소
🗒️ 정수 리스트 num_list
가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을, 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return 하도록 solution 함수를 완성해주세요.
class Solution {
public int[] solution(int[] num_list) {
int len = num_list.length;
int[] answer = Arrays.copyOf(num_list, len + 1);
answer[len] = (num_list[len - 1] > num_list[len - 2])
? num_list[len - 1] - num_list[len - 2] : num_list[len - 1] * 2;
return answer;
}
}
Arrays.copyOf(arr, int newLength)
원본 배열을 앞에서부터 원하는 길이만큼 복사한 새로운 배열 반환
주사위 게임 2
🗒️ 1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a
, b
, c
라고 했을 때 얻는 점수는 다음과 같습니다.
- 세 숫자가 모두 다르다면
a
+b
+c
점을 얻습니다. - 세 숫자 중 어느 두 숫자는 같고 나머지 한 숫자는 다르다면 (
a
+b
+c
) × (a
² +b
² +c
²)점을 얻습니다. - 세 숫자가 모두 같다면 (
a
+b
+c
) × (a
² +b
² +c
²) × (a
³ +b
³ +c
³)점을 얻습니다.
세 정수 a
, b
, c
가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해주세요.
class Solution {
public int solution(int a, int b, int c) {
int sum = a + b + c;
int squaredSum = (a * a) + (b * b) + (c * c);
int cubedSum = (a * a * a) + (b * b * b) + (c * c * c);
if (a == b && b == c) {
return sum * squaredSum * cubedSum;
} else if (a == b || b == c || a == c) {
return sum * squaredSum;
} else {
return sum;
}
}
}
🔎 논리연산자
&&
(AND): 조건이 모두 참이어야 전체가 참||
(OR): 조건이 하나라도 참이면 전체가 참!
(NOT): 조건을 반대로 뒤집기
주사위 게임 3
🗒️ 1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.
- 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
- 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)²점을 얻습니다.
- 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
- 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a
, b
, c
, d
로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해주세요.
class Solution {
public int solution(int a, int b, int c, int d) {
int[] count = new int[7]; // 주사위 숫자를 인덱스로 사용
// 각각의 주사위 숫자가 몇 번 나왔는지 세기
count[a]++;
count[b]++;
count[c]++;
count[d]++;
// 등장한 숫자만 뽑아서 리스트로 저장
List<Integer> nums = new ArrayList<>();
for (int i = 1; i <= 6; i++) {
if (count[i] > 0) nums.add(i);
}
int size = nums.size(); // 서로 다른 숫자의 개수
if (size == 1) {
// 네 개 모두 같을 때
return 1111 * nums.get(0);
} else if (size == 2) {
int p = nums.get(0), q = nums.get(1);
if (count[p] == 3 || count[q] == 3) {
// 세 개는 같고, 한 개만 다를 때
int three = (count[p] == 3) ? p : q;
int one = (count[p] == 1) ? p : q;
return (10 * three + one) * (10 * three + one);
} else {
// 두 개씩 짝지어 같을 때
return (p + q) * Math.abs(p - q);
}
} else if (size == 3) {
// 두 개는 같고, 나머지는 각각 다를 때
int pair = 0, product = 1;
for (int i = 1; i <= 6; i++) {
if (count[i] == 2) pair = i;
if (count[i] == 1) product *= i;
}
return product;
} else {
// 네 개 모두 다를 때
return Math.min(Math.min(a, b), Math.min(c, d));
}
}
}
🤓☝️ 주사위 숫자 등장 횟수를 배열로 카운팅하는 아이디어 ...!
반복문
수열과 구간 쿼리 2
🗒️ 정수 배열 arr
와 2차원 정수 배열 queries
이 주어집니다. queries
의 원소는 각각 하나의 query
를 나타내며, [s, e, k]
꼴입니다. 각 query
마다 순서대로 s
≤ i
≤ e
인 모든 i
에 대해 k
보다 크면서 가장 작은 arr[i]
를 찾습니다. 각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해주세요. 단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
class Solution {
public int[] solution(int[] arr, int[][] queries) {
int[] answer = new int[queries.length];
for (int q = 0; q < queries.length; q++) {
int s = queries[q][0];
int e = queries[q][1];
int k = queries[q][2];
int min = Integer.MAX_VALUE;
boolean found = false;
for (int i = s; i <= e; i++) {
if (arr[i] > k && arr[i] < min) {
min = arr[i];
found = true;
}
}
answer[q] = found ? min : -1;
}
return answer;
}
}
// 다른 풀이
class Solution {
public int[] solution(int[] arr, int[][] queries) {
int[] answer = new int[queries.length];
Arrays.fill(answer, -1); // 기본값은 -1로 설정
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 (arr[j] > k) {
// 아직 아무 값도 없으면 arr[j] 대입, 아니면 더 작은 값으로 갱신
answer[i] = (answer[i] == -1) ? arr[j] : Math.min(answer[i], arr[j]);
}
}
}
return answer;
}
}
🤓☝️ 최솟값 찾는 변수는 Integer.MAX_VALUE
로 초기화하기(반대는 당연히 Integer.MIN_VALUE
)
🤓✌ 먼저 -1로 채워진 배열을 만들어서 플래그로 사용하는 아이디어 ...!!
수열과 구간 쿼리 3
🗒️ 정수 배열 arr
와 2차원 정수 배열 queries
이 주어집니다. queries
의 원소는 각각 하나의 query
를 나타내며, [i, j]
꼴입니다. 각 query
마다 순서대로 arr[i]
의 값과 arr[j]
의 값을 서로 바꿉니다. 위 규칙에 따라 queries
를 처리한 이후의 arr
를 return 하는 solution 함수를 완성해주세요.
class Solution {
public int[] solution(int[] arr, int[][] queries) {
for (int[] query : queries) {
int i = query[0];
int j = query[1];
// temp 변수를 이용한 swap
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
}
배열 만들기 4
🗒️ 정수 배열 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 함수를 완성해주세요.
class Solution {
public int[] solution(int[] arr) {
ArrayDeque<Integer> stack = new ArrayDeque<>();
int i = 0;
while (i < arr.length) {
if (stack.isEmpty()) {
stack.push(arr[i++]);
} else if (arr[i] > stack.peek()) {
stack.push(arr[i++]);
} else {
stack.pop();
}
}
List<Integer> list = new ArrayList<>(stack);
Collections.reverse(list);
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
🤓☝️ "가장 최근에 넣은 값"을 조건에 따라 다시 꺼내거나 버려야 한다면, "스택이 필요해!" 알아차리기
'자바' 카테고리의 다른 글
프로그래머스 코딩 기초 트레이닝 🔥 리스트(배열) (1) | 2025.05.02 |
---|---|
지삐띠니야 메서드 알려줘 (0) | 2025.05.02 |
프로그래머스 코딩 기초 트레이닝 🔥 출력 / 연산 / 문자열 (0) | 2025.04.30 |
프로그래머스 코딩테스트 입문 60% (0) | 2025.04.27 |
프로그래머스 코딩테스트 입문 40% (0) | 2025.04.27 |