더보기
입력된 문자열 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;
}
}
코드 | 비고 | |
입력된 문자열 |
||
문자를 하나씩 늘려가며 |
||
문자가 입력된 문자열 |
문제 풀이: 임의의 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;
}
}
코드 | 비고 | |
알파벳 소문자 |
||
임의의 ASCII 코드를 사용해 |
더보기
예를 들어 skip의 인자로 wbqd가 입력되면 모킹된 ASCII 코드는 acefghijklmnoprstuvxyz입니다. 이때 처리 문자 u는 다음과 같이 동작합니다.
코드 | 비고 | |
ASCII 코드 모킹 값은 17입니다. | ||
입력된 index는 5입니다. 수식에서 (17+5) % 22 = 0이 계산됩니다. | ||
계산된 결과 0을 사용해 ASCII 코드 모킹에서의 문자를 찾습니다. 인덱스 0에 위치한 문자는 a입니다. |
Loop를 포함하지 않는 단순 연산으로 입력된 int index의 값에서 독립된 실행 시간을 보장합니다.
'Algorithm > Programmers' 카테고리의 다른 글
Level 1: PCCP 기출문제 - 이웃한 칸, 이중 배열의 랜덤 엑세스 (0) | 2023.12.04 |
---|---|
Level 1: PCCP 기출문제 - 붕대 감기, 시간 경과에 따른 로직 계산 (0) | 2023.12.04 |
Level 1: 예산, 배열의 오름차순 정렬 (0) | 2023.11.30 |
Level 1: 문자열 내 마음대로 정렬하기, Arrays.sort()와 Stream의 sorted() (0) | 2023.11.30 |
Level 1: 나누어 떨어지는 숫자 배열, Stream의 filter()와 sorted() (0) | 2023.11.30 |