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

fsm12·2023년 6월 18일
0

프로그래머스

목록 보기
14/57
post-thumbnail
post-custom-banner

문제링크

문제 이해

[ 입력형태 / 조건 ]

s
index만큼 증가시킬 문자열 | "aukks"

skip
증가시킬 때 포함하지 않을 문자들 | "wbqd"

index
증가할 수치 | 5

[ 문제 ]

=> s의 각 문자를 index만큼 증가시키되 skip에 속한 문자는 증가 대상에 포함하지 않을 때 만들어지는 문자열을 return

[ 풀이 ]

각 문자를 증가시키면서 skip에 속한 문자가 존재하면 +1을 한번더 진행



코드

> [성공] 1차 시도 : .contains() 이용

  • 생각한 풀이 그대로 구현
import java.util.*;

class Solution {
    public String solution(String inp_s, String inp_skip, int inp_index) {
        String answer = "";
        for(char s : inp_s.toCharArray()){
             for (int index = 0; index < inp_index; index++) {
                s += 1;
                if (s > 'z') {
                    s -= 26;
                }
                if (inp_skip.contains(String.valueOf(s))) {
                    index--;
                }
            }
            answer += s;
        }
        return answer;
    }
}




> [성공] 2차 시도 : Set 이용

  • String보다 Set이 빠를거라 생각했음
import java.util.*;

class Solution {
    public String solution(String inp_s, String inp_skip, int inp_index) {
        Set<Character> skip_set = new HashSet<>();
        for(char skip : inp_skip.toCharArray()){
            skip_set.add(skip);
        }
        
        String answer = "";
        for(char s : inp_s.toCharArray()){
             for (int index = 0; index < inp_index; index++) {
                s += 1;
                if (s > 'z') {
                    s -= 26;
                }
                if (skip_set.contains(s)) {
                    index--;
                }
            }
            answer += s;
        }
        return answer;
    }
}


=> 더 느린 결과가 나왔음


> [성공] 3차 시도 : Set + StringBuilder 이용

  • 문자열 += 문자 연산이 꽤나 오래 걸릴 것이라 생각해서 가변 문자열로 변경
import java.util.*;

class Solution {
    public String solution(String inp_s, String inp_skip, int inp_index) {
        Set<Character> skip_set = new HashSet<>();
        for(char skip : inp_skip.toCharArray()){
            skip_set.add(skip);
        }
        
        StringBuilder answer = new StringBuilder();
        for(char s : inp_s.toCharArray()){
             for (int i = 0; i < inp_index; i++) {
                s += 1;
                if (s > 'z') {
                    s -= 26;
                }
                if (skip_set.contains(s)) {
                    i--;
                }
            }
            answer.append(s);
        }
        return answer.toString();
    }
}

=> 빠르게 연산이 가능했음


> [성공] 4차 시도 : 알파벳 문자열에서 skip할 문자를 제거 후 인덱싱 + StringBuilder 이용

  • 인덱스를 차례차례 증가시키는 방법보다 전체 대치를 하는 방법을 생각해서 구현해봄
import java.util.*;

class Solution {
    public String solution(String inp_s, String inp_skip, int inp_index) {
        String alpha = "abcdefghijklmnopqrstuvwxyz";
        for(String skip : inp_skip.split("")){
            alpha = alpha.replace(skip, "");
        }
        
        int len = alpha.length();
        StringBuilder ans = new StringBuilder();
        for(String s : inp_s.split("")){
            ans.append(alpha.charAt((alpha.indexOf(s) + inp_index)%len));
        }
        return ans.toString();
    }
}


=> 비슷했지만 좀더 많은 테케에서 빠른 속도로 실행이 가능했음



TIP : 문자열 합치기 연산을 해야할 경우 StringBuilder를 쓰는 것이 효율적이다.

post-custom-banner

0개의 댓글