https://school.programmers.co.kr/learn/courses/30/lessons/155652
문제
두 문자열 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 함수를 완성해주세요.
풀이
문자열을 index 만큼 뒤로 보낸 결과를 return 하는 문제이다.
단, skip 하는 알파벳은 index에 포함되지 않는다.
필자는 먼저 skip하는 알파벳을 정리하였고, 이후 반복문을 돌리며 각 문자를 index만큼 뒤로 보내는 방법으로 문제를 해결하였다.
🔔 자세한 코드 설명은 더보기 란에 작성하였습니다.
1. skipArr 배열 설정 : 크기가 26인 boolean 배열을 만들어, skip하는 알파벳 순서에 맞게 true로 설정하였다.
boolean[] skipArr = new boolean[26];
for(int i = 0; i < skip.length(); i++) {
skipArr[skip.charAt(i)-'a'] = true;
}
2. 각각의 알파벳을 index만큼 뒤로 보냈다.
- for 문에서 매번 j를 증가시키지 않고, skip이 false인 경우에만 j를 증가시켰다.
- 'z'에서 1이 증가될 경우, 알파벳 범위에 맞게 26을 빼도록 하였다. ('z' → 'a'로 가도록)
char c = s.charAt(i);
for(int j = 0; j < index;) {
c += 1;
if(c > 'z') c -= 26;
if(!skipArr[c - 'a']) j++;
}
answer += c;
코드
class Solution {
public String solution(String s, String skip, int index) {
String answer = "";
boolean[] skipArr = new boolean[26];
for(int i = 0; i < skip.length(); i++) {
skipArr[skip.charAt(i)-'a'] = true;
}
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
for(int j = 0; j < index;) {
c += 1;
if(c > 'z') c -= 26;
if(!skipArr[c - 'a']) j++;
}
answer += c;
}
return answer;
}
}
틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!
'[JAVA]프로그래머스 > Lv.1' 카테고리의 다른 글
[JAVA]프로그래머스 - 크기가 작은 부분 문자열 (0) | 2024.04.11 |
---|---|
[JAVA]프로그래머스 - 숫자 문자열과 영단어 (0) | 2024.04.10 |
[JAVA]프로그래머스 - 삼총사 (0) | 2024.04.09 |
[JAVA]프로그래머스 - 바탕화면 정리 (0) | 2024.04.07 |
[JAVA]프로그래머스 - 달리기 경주 (0) | 2024.04.05 |