본문 바로가기

Algorithm/Programmers

Level 1: 둘만의 암호, 임의의 ASCII 코드 연산을 모킹하여 풀이

이 문서의 내용

    더보기

    입력된 문자열 String s에서 각 문자를 입력된 int index만큼 건너뜁니다.

    문자는 알파벳 소문자만 존재한다고 가정합니다. 이때 알파벳 소문자 중 입력된 문자열 String skip에 포함된 문자는 제외됩니다.

    만약 마지막 문자를 넘어서 건너뛰게 되면 최초의 문자에서 다시 시작합니다.

    문제 풀이: while문을 사용하여 문자 건너뛰기

    입력된 문자열 String s의 각 문자에 대해서 다음을 처리합니다.

    • 입력된 int index만큼 건너뜁니다.
    • 건너뛰는 과정에서 알파벳 소문자 z를 넘어서면 a에서 다시 시작합니다.
    • 건너뛰는 과정에서 입력된 문자열 String skip에 포함되는 문자는 횟수를 카운팅하지 않습니다.
    public class Solution {
    	public String solution(String s, String skip, int index) {
    		String answer = "";
    		for (char c : s.toCharArray()) {
    			int remain = index;
    			while (0 < remain) {
    				++c;
    				if (c > 'z') c = 'a';
    				if (0 > skip.indexOf(c)) --remain;
    			}
    			
    			answer += ((char) c);
    		}
    		
    		return answer;
    	}
    }
    코드 비고
    Line 4 toCharArray() 입력된 문자열 String s의 각 문자에 대해서 처리합니다.
    Line 7:8 ++c 문자를 하나씩 늘려가며 z를 넘어서면 a에서 다시 시작합니다.

    if (c > 'z') c = 'a'
    Line 9 if (0 > skip.indexOf(c)) 문자가 입력된 문자열 String skip에 포함되지 않으면 카운팅합니다.

    문제 풀이: 임의의 ASCII 코드 연산을 모킹

    while 문을 사용한 풀이는 간단하게 구현 할 수 있지만 실행 속도에 문제가 있을 수 있습니다. 예를 들어 입력된 int index가 커질수록 각 문자를 처리하는데 드는 시간 비용 역시 비례해서 늘어납니다.

    다음 예시는 a부터 z까지의 소문자 알파벳 중 입력된 문자열 String skip에 포함되지 않은 것을 필터합니다. 그 다음 필터된 알파벳을 가지고 ASCII 코드 연산을 모킹합니다.

    public class Solution {
    	public String solution(String s, String skip, int index) {
    		String alphas = "";
    		for (int i = 'a'; i <= 'z'; ++i) {
    			if (0 > skip.indexOf((char) i)) alphas += (char) i;
    		}
    		
    		String answer = "";
    		for (char c : s.toCharArray()) {
    			int i = (alphas.indexOf(c) + index) % alphas.length();
    			answer += ((char) alphas.charAt(i));
    		}
    		
    		return answer;
    	}
    }
    코드 비고
    Line 4:7 String alphas 알파벳 소문자 a부터 z 중에서 입력된 문자열 String skip을 포함하지 않는 ASCII 코드를 만듭니다. 
    Line 10:11 (alphas.indexOf(c) + index) % alphas.length() 임의의 ASCII 코드를 사용해 ASCII 코드 연산을 모킹합니다.
    더보기

    예를 들어 skip의 인자로 wbqd가 입력되면 모킹된 ASCII 코드는 acefghijklmnoprstuvxyz입니다. 이때 처리 문자 u는 다음과 같이 동작합니다.

    코드 비고
    Line 10 alphas.indexoOf("u") ASCII 코드 모킹 값은 17입니다.
    (alphas.indexOf(c) + index) % alphas.length() 입력된 index는 5입니다. 수식에서 (17+5) % 22 = 0이 계산됩니다.
    Line 11 (char) alphas.charAi(0) 계산된 결과 0을 사용해 ASCII 코드 모킹에서의 문자를 찾습니다. 
    인덱스 0에 위치한 문자는 a입니다.

    Loop를 포함하지 않는 단순 연산으로 입력된 int index의 값에서 독립된 실행 시간을 보장합니다.