[프로그래머스] - 둘만의 암호

YongHyun·2023년 5월 26일
0
post-thumbnail

둘만의 암호

문제 풀이

주어진 문자열 s의 각 알파벳을 index 만큼 뒤로 바꾼 s 를 출력하면 되는 문제이다. 단, skip 에 포함되어 있는 알파벳은 건너뛰어야 하며 z 를 넘어갈 경우에는 다시 a 로 돌아와서 순회하면 되는 문제이다.

일단 이해하는데는 크게 어려운 점은 없었다. z 를 넘어갈 경우 다시 a 로 돌아온다는 문자을 보고 Queue 를 활용하면 쉽게 풀 수 있을것 같다고 생각해 문제에 적용하였다.

또 skip 에 포함되어 있는지 확인하기 위해서 String 에 contains() 메서드를 사용하면 된다.

이를 코드에 적용하면 다음과 같다.

import java.util.*;
import java.io.*;

class Solution {
    public String solution(String s, String skip, int index) {
        StringBuilder sb = new StringBuilder();
        Queue<Character> queue = new LinkedList();

        for (int i = 0; i < 26; i++) {
            queue.add((char) (i + 97));
        }

        for (int i = 0; i < s.length(); i++) {
            char alphabat = s.charAt(i);
            int count = index;

            while (true) {
                if (queue.peek() == alphabat) {
                    char c = ' ';
                    queue.add(queue.poll());
                    while (count != 0) {
                        c = queue.poll();
                        if (!skip.contains(String.valueOf(c))) {
                            count--;
                        }
                        queue.add(c);
                    }
                    sb.append(c);
                    break;
                } else {
                    char poll = queue.poll();
                    queue.add(poll);
                }
            }
        }
        return sb.toString();
    }
}

물론 통과 되기는 하지만 시간에서 약간 불만족스럽다. 그래서 다른 분들의 풀이를 보니 이렇게 푸는 것이 더 좋은것 같다고 생각해서 참고해보았다. 오히려 Queue를 사용하는 것이 독이된 것 같았다.

import java.util.*;
import java.io.*;

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();
    }
}

회고

이번 문제는 나름 생각하면서 풀어서 확실한 정답이라고 생각하였지만 역시나 다른 분들의 코드를 보니 더욱 깔끔한 코드들이 넘쳐나 있었다.

이번 문제는 너무 어렵게 꼬아서 푼것도 있는것 같다.

한 문제를 풀더라도 풀이 방법은 다양하기 때문에 꼭 내 코드만 정답이라는 생각은 버리자는 생각을 가지게 되는 문제였던 것 같다.

profile
백엔드 개발자 되기 위한 여정

0개의 댓글