해당 문제 는 코테 문제에서 자주 등장하는 배열 회귀 문제로, 현재 인덱스에서 이동하고자 하는 인덱스를 더한 뒤 배열의 길이로 나눈 나머지를 취하는 형식으로 n칸을 이동한 뒤의 인덱스의 요소를 찾아올 수 있는데요.
그래서 이 문제를 풀기 위해서는 우선 알파벳을 담은 배열이나 문자열을 하나 만들어준 후 그 문자열에서 skip의 변수들을 제거한 후의 알파벳 배열을 만드는 작업 하나, 해당 배열을 이동해서 위에서 언급한대로 지정된 인덱스로 이동하여 차례대로 요소를 구해 리턴해주는 작업 총 두 작업이 필요합니다.
그럼 해당 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.
- 자바스크립트 버전
function solution(s, skip, index) { // 알파벳을 a부터 z까지 문자열로 취합한 후 split 메서드를 이용해 배열로 변환 const alphabetArr = 'abcdefghijklmnopqrstuvwxyz'.split(''); // 반환한 배열(문자열)을 담을 변수 let filteredAlphaArr = ""; //filter 메서드를 이용해 문자열들 중 skip 문자열에 포함되지 않는 요소들만 취합한 뒤 반환된 배열을 filteredAlphaArr에 할당 let filteredAlphaArr = alphabetArr.filter(letter => !skip.includes(letter)); // 반환된 알파벳 배열의 길이 const length = filteredAlphaArr.length; // 조건에 맞는 문자들을 취합할 result 문자열 let result = ""; // for문을 s.length (주어진 s의 길이)만큼 반복하면서 for(let i = 0 ; i < s.length ; i++){ // 현재 문자의 인덱스에는 변환된 알파벳 배열의 s[i] 번째 인덱스로 할당하고 let letterIndex = filteredAlphaArr.indexOf(s[i]) // 우리가 찾을 인덱스는 ((현재 인덱스 + n 이동 인덱스) % 반환된 배열의 길이) 공식으로 찾아줍니다. let newIndex = (letterIndex + index) % length; // 찾은 newIndex의 값을 이용해 반환된 알파벳 배열의 newIndex번째의 요소를 result에 누적 취합 result += filteredAlphaArr[newIndex] } // 배열 반환 return result; }
참고로 반환된 배열을 구하는 방법은 본문의 filter 뿐만 아니라 indexOf, includes, 순수하게 for문만 이용하는 방법 등이 존재합니다.
// idexOf 이용법 for (let i = 0; i < alphabetArr.length; i++) { if (skip.indexOf(alphabetArr[i]) === -1) { filteredAlphaArr+=alphabetArr[i]; } } // includes 이용법 for(let i = 0 ; i < alphabetArr.length ; i++){ if (!skip.includes(alphabetArr[i])){ filteredAlphaArr += alphabetArr[i] } } // 순수하게 for문만 이용하는 방법 for(let i = 0 ; i < alphabetArr.length ; i++){ let flag = true; for(let j = 0; j < s.length ; j++){ if(alphabetArr[i] === skip[j]){ flag = false; break; } }
그리고 자바 버전으로 구현한 코드는 다음과 같습니다.
- 자바 버전
class Solution { public static String solution(String s, String skip, int index) { String alphabet = "abcdefghijklmnopqrstuvwxyz"; String filteredAlphaArr = ""; // alphabet에서 skip에 포함되지 않은 문자들만 추가 for (int i = 0; i < alphabet.length(); i++) { char current = alphabet.charAt(i); if (!skip.contains(String.valueOf(current))) { filteredAlphaArr += current; } } int length = filteredAlphaArr.length(); String result = ""; // 주어진 문자열을 순회하며 인덱스 변환 for (int i = 0; i < s.length(); i++) { char current = s.charAt(i); int letterIndex = filteredAlphaArr.indexOf(current); int newIndex = (letterIndex + index) % length; result += filteredAlphaArr.charAt(newIndex); } return result; } }
JS
의 경우 배열에 유동적인 접근이 가능하지만, 자바
의 경우 문자열과 문자를 취급하는 메서드가 각각 달라 꽤 애를 먹은 기억이 있습니다. 특히나 valueOf나 indexOf의 메서드는 각각 취급하는 매개 변수의 타입이 달라 특히나 더 헷갈렸든 듯 합니다.
문자열 포함 여부 메서드의 경우 JS
는 includes 메서드가 있고, 자바
는 contains 메서드 가 있는데, includes 메서드에 비해 contains 메서드는 자바가 가지고 있는 정적 타입 특성상 쓰기가 includes보다 까다로웠습니다.