[프로그래머스 코딩테스트 연습문제] 둘만의 암호 문제 풀이 with 자바스크립트(Javascript) & 자바(Java)

Re_Go·2024년 7월 1일
0

코딩테스트연습

목록 보기
88/106
post-thumbnail

1. 첫번째 문제 풀이(2024-07-01)

해당 문제 는 코테 문제에서 자주 등장하는 배열 회귀 문제로, 현재 인덱스에서 이동하고자 하는 인덱스를 더한 뒤 배열의 길이로 나눈 나머지를 취하는 형식으로 n칸을 이동한 뒤의 인덱스의 요소를 찾아올 수 있는데요.

그래서 이 문제를 풀기 위해서는 우선 알파벳을 담은 배열이나 문자열을 하나 만들어준 후 그 문자열에서 skip의 변수들을 제거한 후의 알파벳 배열을 만드는 작업 하나, 해당 배열을 이동해서 위에서 언급한대로 지정된 인덱스로 이동하여 차례대로 요소를 구해 리턴해주는 작업 총 두 작업이 필요합니다.

그럼 해당 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.

  1. 자바스크립트 버전
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;
    } 
  }

그리고 자바 버전으로 구현한 코드는 다음과 같습니다.

  1. 자바 버전
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;
    }
}

2. 자바와 자바스크립트 풀이 차이점

  1. JS의 경우 배열에 유동적인 접근이 가능하지만, 자바의 경우 문자열과 문자를 취급하는 메서드가 각각 달라 꽤 애를 먹은 기억이 있습니다. 특히나 valueOf나 indexOf의 메서드는 각각 취급하는 매개 변수의 타입이 달라 특히나 더 헷갈렸든 듯 합니다.

  2. 문자열 포함 여부 메서드의 경우 JSincludes 메서드가 있고, 자바contains 메서드 가 있는데, includes 메서드에 비해 contains 메서드는 자바가 가지고 있는 정적 타입 특성상 쓰기가 includes보다 까다로웠습니다.

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글