본문 바로가기

코딩 테스트/프로그래머스

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

반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/155652

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 분석

문자열 s 와 skip 그리고 index 가 주어졌을 때 아래 규칙에 따라 새로운 문자열을 만든다.

  • 문자열 s 의 각 알파벳을 index 만큼 뒤의 알파벳으로 바꿔준다.
  • index 만큼 뒤의 알파벳이 z를 넘어갈 경우 다시 a 로 돌아간다.
  • skip 에 있는 알파벳을 제외하고 건너뛴다.

 

제한사항

  • 5 <= s 의 길이 <= 50
  • 1 <= skip 의 길이 <= 10
  • s 와 skip 은 소문자로만 이루어져 있다.
    • skip 에 포함되는 알파벳은 s 에 포함되지 않는다.
  • 1 <= index <= 20

 

문제 그대로 풀면된다. 

 

시간 복잡도를 계산해보면 

(s 길이 * skip 길이 * index 크기)로 최대 50*10*20 밖에 걸리지 않아 그냥 풀어도 될 거 같다.

 

하지만 HashMap 을 사용한다면 매번 해당 문자가 skip 에 있는 지 확인 할 필요가 없기 때문에 시간을 좀 더 단축시킬 수 있다.

 

코드

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        String result = "";
        char[] sArr = s.toCharArray();
        HashMap<Character, Boolean> skipMap = new HashMap<>();

        for (char c : skip.toCharArray()) {
            if(!skipMap.containsKey(c)){
                skipMap.put(c, true);
            }
        }

        for(int i=0; i<sArr.length; i++){
            char cur = sArr[i];

            int cnt = index;

            while(cnt > 0){
                cur++;
                if(cur > 122) cur -= 26;
                if(skipMap.containsKey((char)cur)) continue;
                cnt--;
            }
            sArr[i] = cur;
        }
        for (char c : sArr) {
            result += c;
        }
        return result;
    }
}
반응형