본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 둘만의 암호(C#)

by jyppro 2023. 9. 17.

둘만의 암호

오늘은 "둘만의 암호" 문제를 풀어보도록 하겠습니다. 이 문제의 정답률은 52% 입니다.

 

문제 설명

두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.

 

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


예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.

두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.

 

제한사항

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

 

입출력 예

 

s skip index result
"aukks" "wbqd" 5 "happy"

 

입출력 예 설명

입출력 예 #1
본문 내용과 일치합니다.

 

시작 코드

using System;

public class Solution {
    public string solution(string s, string skip, int index) {
        string answer = "";
        return answer;
    }
}

 

나의 풀이

using System;

public class Solution {
    public string solution(string s, string skip, int index) {
        string answer = "";
        char temp;
        for(int i = 0; i < s.Length; i++)
        {
            temp = s[i];
            for(int j = 0; j < index; )
            {
                temp = (char)((int)temp + 1);
                if(temp > 'z') { temp = 'a'; }
                if(skip.Contains(temp) == true) { continue; }
                j++;
            }
            answer += temp;
        }
        return answer;
    }
}

 

코드 분석

string타입의 문자열 s와 skip 그리고 int형 정수 index가 주어지며 코드가 시작됩니다. char타입 변수 temp를 선언하고, 이중 for문 안에 if문 두개를 사용하여 실행시킵니다. 첫번째 for문은 i = 0부터 s의 길이까지 돌리며 temp에 s[i]를 넣어줍니다.

두번째 for문은 j = 0에서 index까지 돌립니다. 그 안에서 temp에 int형으로 변환한 temp에 1을 더해서 char타입으로 다시 바꿔 넣어줍니다. 그리고 두개의 if문을 만나는데 첫 if문은 temp가 z보다 크다면 a를 넣어주는 것이고, 두번째는 skip이 temp를 포함하고 있다면 continue문을 실행하도록 합니다. if문을 빠져나가고 j를 올려줍니다. 그리고 for문을 빠져나가answer에 temp를 더해주고 마지막 for문까지 빠져나오면 answer를 리턴하면서 코드가 종료됩니다.

 

풀이 설명

이번 문제에서 요구하는 것은 말 그대로 암호 해독입니다. 알파벳으로 이루어진 s 문자열이 주어지면, index만큼 뒤에 있는 것으로 바꿔줍니다. 하지만 이때, skip에 포함되는 단어는 건너뛰어야 합니다. 이제 풀이를 살펴보겠습니다.

 

temp를 선언하고 바로 이중 for문을 만나게 되는데 첫 for문은 s의 알파벳을 하나씩 잡는 용도, 두번째 for문은 잡힌 s의 알파벳을 index만큼 뒤로 이동시키는 역할입니다. 여기서 저희가 고려해야 할 것은 두가지가 있는데 if문 두개가 그것을 보여줍니다. 첫 if문은 문제에서도 이야기했듯이 알파벳은 z까지 있기 때문에 이를 넘어가면 a로 돌아오는 조건과 두번째 if문은 skip에 포함되었는지 여부에 따라 j를 올리지 않고 다음 반복문으로 넘어가는 것을 판단해줍니다. 그렇게 바뀐 문자열의 단어를 하나씩 변환하여 answer에 넣어주면 최종암호가 완성됩니다.

 

<NEXT>

오늘은 "둘만의 암호" 문제를 풀어보았습니다. 방식만 차분하게 잘 생각한다면 풀이 자체는 복잡하지 않습니다. 다음에는 "햄버거 만들기" 문제를 다뤄보도록 하겠습니다. 감사합니다.