본문 바로가기

[IT] 코딩테스트/[문제 및 풀이] 프로그래머스

[프로그래머스] 둘만의 암호 / 자바(Java)

728x90

문제

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

 

프로그래머스

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

programmers.co.kr


해설

3가지 요소, 문자열 s, skip과 자연수 index가 존재합니다

 

1. 문자열  s의 각 문자를 index만큼 뒤의 알파벳으로 바꿔줍니다

(s ="abd", index = 2  이라면  "cdf")

2. 이때 알파벳이 'z'를 넘어간다면 'a'로 돌아가 그 다음 알파벳으로 바꿉니다

(s = "xyz", index = 2 이라면 "zab")

3. 또한 skip에 있는 알파벳은 제외하고 건너뜁니다

(s = "ace", index=4, skip="d" 이라면 "fhi")

 

1번 조건을 만족시키기 위해 s의 각 문자 cur에서 index만큼 더해 바뀌는 알파벳을 확인합니다

2번 조건을 위해서 cur+index의 값이 'z' 에 해당되는 값을 넘긴다면 'a'로 되돌려 줍니다.

3번 조건을 위해서 하나씩 다음 알파벳으로 바꾸며, 바뀐 알파벳이 skip에 해당된다면 한번 더 바뀌도록 합니다

 

s의 길이가 최대 50이고, skip의 최대 길이가 10, index는 최대 20이므로

for문을 사용하는 최악의 경우이라도 50 * 10 * 20 = 10000가 되어 구현 방식을 자유롭게 두어도 괜찮다고 생각됩니다.

주의점

  • 경계값 ('a', 'z')
  • 건너뛰면서 제외되는 알파벳이 포함되는 경우

코드

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        
        for(int i=0;i<s.length();i++){
            char cur = s.charAt(i);
            for(int j=0;j<index;j++){
                cur++;
                if(cur>'z'){
                    cur-=26;
                }
                if(skip.contains(String.valueOf(cur))) j--;
            }
            answer += cur;
            
        }
        
        return answer;
    }
}
728x90