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

Re_Go·2024년 7월 1일
0

코딩테스트연습

목록 보기
88/98
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개의 댓글

관련 채용 정보