이지은님의 블로그
[Java] 프로그래머스 문제 풀이 - 암호 해독, 두 수의 연산값 비교하기, 대문자와 소문자, 인덱스 바꾸기, 약수 구하기 (Character.isLowerCase(), IntStream.rangeClosed()) 본문
[Java] 프로그래머스 문제 풀이 - 암호 해독, 두 수의 연산값 비교하기, 대문자와 소문자, 인덱스 바꾸기, 약수 구하기 (Character.isLowerCase(), IntStream.rangeClosed())
queenriwon3 2025. 6. 4. 11:231️⃣ 암호 해독 (https://school.programmers.co.kr/learn/courses/30/lessons/120892)
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.
암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.
👉 사용한 방법 - StringBuilder를 이용한 방법
class Solution {
public String solution(String cipher, int code) {
StringBuilder sb = new StringBuilder();
for (int i = code - 1; i < cipher.length(); i += code) {
sb.append(cipher.substring(i, i + 1));
}
return sb.toString();
}
}
2️⃣ 두 수의 연산값 비교하기 (https://school.programmers.co.kr/learn/courses/30/lessons/181938)
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.
12 ⊕ 3 = 123
3 ⊕ 12 = 312
양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 * a * b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요.
단, a ⊕ b와 2 * a * b가 같으면 a ⊕ b를 return 합니다.
👉 사용한 방법 - Integer.parseInt()와 Math.max()를 사용
class Solution {
public int solution(int a, int b) {
int num = Integer.parseInt("" + a + b);
return Math.max(num, 2 * a * b);
}
}
3️⃣ 대문자와 소문자 (https://school.programmers.co.kr/learn/courses/30/lessons/120893)
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.
👉 사용한 방법 - Character.isLowerCase(), Character.isUpperCase(), Character.toLowerCase(), Character.toUpperCase() 사용
class Solution {
public String solution(String my_string) {
StringBuilder sb = new StringBuilder();
for (char c : my_string.toCharArray()) {
if (Character.isLowerCase(c)) {
sb.append(Character.toUpperCase(c));
} else {
sb.append(Character.toLowerCase(c));
}
}
return sb.toString();
}
}
-> 통과 (0.05ms, 82.5MB)
🎯 정리
작업 | 메서드 이름 | 예시 |
소문자인지 확인 | Character.isLowerCase(c) | 'a' → true |
대문자인지 확인 | Character.isUpperCase(c) | 'A' → true |
소문자 → 대문자 변환 | Character.toUpperCase(c) | 'a' → 'A' |
대문자 → 소문자 변환 | Character.toLowerCase(c) | 'Z' → 'z' |
4️⃣ 인덱스 바꾸기 (https://school.programmers.co.kr/learn/courses/30/lessons/120895)
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
👉 사용한 방법 - 문자 배열로 만들어 배열 교환
class Solution {
public String solution(String my_string, int num1, int num2) {
char[] charArray = my_string.toCharArray();
char temp = charArray[num1];
charArray[num1] = charArray[num2];
charArray[num2] = temp;
return new String(charArray);
}
}
new String(문자 배열)을 통해 문자열을 생성할 수 있다.
-> 통과 (0.02ms, 79.5MB)
5️⃣ 약수 구하기 (https://school.programmers.co.kr/learn/courses/30/lessons/120897)
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
👉 사용한 방법1 - IntStream.rangeClosed() 사용
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] solution(int n) {
return IntStream.rangeClosed(1, n).filter(v -> n % v == 0).toArray();
}
}
IntStream.rangeClosed()를 사용하여 먼저 1부터 시작하는 스트림 배열을 생성하고 필터링
-> 통과 (2.66ms, 76.7MB)
👉 사용한 방법2 - ArrayList를 사용해 add한 후 배열 추출
class Solution {
public int[] solution(int n) {
List<Integer> numList = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
numList.add(i);
}
}
return numList.stream().mapToInt(v -> v).toArray();
}
}
ArrayList를 생성하여 해당되는 값을 반복문을 이용하여 삽입 후
mapToInt와 toArray()를 사용하여 배열 추출
-> 통과 (1.92ms, 80.6MB)
👉 사용한 방법3 - 반복조건문을 사용하여 배열크기를 반환 후 배열에 값 삽입
class Solution {
public int[] solution(int n) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0) cnt++;
}
int[] nums = new int[cnt];
int idx = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0) nums[idx++] = i;
}
return nums;
}
}
배열크기를 추출하여 해당되는 값에 배열을 삽입하면 ArrayList를 사용하지 않아도 된다.
-> 통과 (0.27ms, 84.1MB)
✅ 세 가지 방법 요약
방법 | 시간복잡도 | 장점 | 단점 | 성능 |
방법 1 IntStream.rangeClosed() |
O(n) | - 코드가 간결하고 선언적 - 함수형 프로그래밍 스타일 - 한 줄로 끝남 |
- Stream API는 반복문보다 상대적으로 느릴 수 있음 - 가독성은 호불호 |
❗ 2.66ms, 76.7MB |
방법 2 ArrayList + Stream |
O(n) | - 코드 직관적 - 배열 크기 모르더라도 처리 가능 - 리스트 활용으로 유연성↑ |
- 추가적인 리스트 객체 사용으로 메모리 사용 증가 | ✅ 1.92ms, 80.6MB |
방법 3 2-pass for문 |
O(n) | - 가장 빠름 - 추가 객체 없음 (ArrayList 없이 int[]만 사용) - 메모리 효율적 |
- 약수를 두 번 탐색해야 함 (2n번 반복) - 구현 길이 조금 더 김 |
🥇 0.27ms, 84.1MB |
최고의 실행 성능이 목표일 경우 | ✅ 방법 3 (2-pass for문) |
간결하고 직관적인 코드가 중요할 경우 | ✅ 방법 1 (Stream) |
배열 크기를 사전에 모를 때 또는 List가 필요한 경우 | ✅ 방법 2 (ArrayList 사용) |
📌 참고
- 작은 입력(n ≤ 100)에서는 성능 차이 거의 없음
- 하지만 큰 데이터셋에서는 방법 3이 확연히 빠릅니다
- ArrayList는 내부적으로 크기 증가 시 복사 비용이 있으므로 메모리에 민감한 상황에선 주의