inblog logo
|
LHS's Study Space
    알고리즘문제풀기프로그래머스

    [프로그래머스] 둘만의 암호(155652)

    lhs's avatar
    lhs
    Dec 04, 2024
    [프로그래머스] 둘만의 암호(155652)
    Contents
    1. 문제 풀이 아이디어2. 나의 정답 코드3. 정리4. 더 좋은 코드 리뷰
    school.programmers.co.kr
    https://school.programmers.co.kr/learn/courses/30/lessons/155652
     

    1. 문제 풀이 아이디어

    • 스킵 문자를 정렬한 후, 해석할 문자를 index만큼 증가시키고, 스킵 문자에 따라 반복문을 통해 계산하여 문제를 해결한다.

    2. 나의 정답 코드

    class Solution { public String solution(String s, String skip, int index) { StringBuilder answer = new StringBuilder(); skip = Arrays.stream(skip.split("")).sorted().collect(Collectors.joining()); for (char c : s.toCharArray()) { int cs = c + index; for (char cc : skip.toCharArray()) { if (cs < cc) break; if (c < cc) { cs++; } } while (cs > 'z') { cs = cs - 'z' - 1 + 'a'; for (char cc : skip.toCharArray()) { if (cs < cc) break; cs++; } } answer.append((char) cs); } return answer.toString(); } }

    3. 정리

    • stream을 사용해 skip 문자를 정렬한다.
    • s의 각 문자를 index만큼 증가시킨다.
    • 스킵 문자들을 순회하며, cs보다 작은 경우 루프를 빠져나오고, c보다 큰 경우 cs 값을 증가시킨다.
    • cs 값이 'z'보다 클 경우 cs를 다시 a로 돌아가서 다시 위 과정을 반복한다.
    • 최종적으로 계산된 cs 값을 StringBuilder에 추가하여 최종 문자열을 생성하여 문제를 해결한다.

    4. 더 좋은 코드 리뷰

    class Solution { public String solution(String s, String skip, int index) { StringBuilder answer = new StringBuilder(); for (char letter : s.toCharArray()) { char temp = letter; int idx = 0; while (idx < index) { temp = temp == 'z' ? 'a' : (char) (temp + 1); if (!skip.contains(String.valueOf(temp))) { idx += 1; } } answer.append(temp); } return answer.toString(); } }
    • 문자를 1씩 증가시키고 skip에서 contains 메서드를 사용하여 문제를 해결했을 때 성능이 더 효율적이다.
    • 성능 비교
    • inbex가 크지 않고 정렬하는데 큰 비용이 발생하므로 나의 정답은 비효율적이었다.
    나의 정답
    나의 정답
    다른 사람의 정답
    다른 사람의 정답
    • 정렬 : O(n log n)
    • 문자 변환 : O(n * m)
    • 최종 복잡도 : O(n * m + n log n)
     
    • 문자 변환 : O(n * index * m)
    • 최종 복잡도: O(n * index * m)
    Share article
    Contents
    1. 문제 풀이 아이디어2. 나의 정답 코드3. 정리4. 더 좋은 코드 리뷰

    LHS's Study Space

    RSS·Powered by Inblog