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

lhs's avatar
Dec 04, 2024
[프로그래머스] 둘만의 암호(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

LHS's Study Space