Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

이지은님의 블로그

[Java] 프로그래머스 문제 풀이 - 암호 해독, 두 수의 연산값 비교하기, 대문자와 소문자, 인덱스 바꾸기, 약수 구하기 (Character.isLowerCase(), IntStream.rangeClosed()) 본문

알고리즘 공부/[JAVA] 코드카타

[Java] 프로그래머스 문제 풀이 - 암호 해독, 두 수의 연산값 비교하기, 대문자와 소문자, 인덱스 바꾸기, 약수 구하기 (Character.isLowerCase(), IntStream.rangeClosed())

queenriwon3 2025. 6. 4. 11:23

1️⃣ 암호 해독 (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는 내부적으로 크기 증가 시 복사 비용이 있으므로 메모리에 민감한 상황에선 주의