Algorithm/알고리즘

프로그래머스 둘만의 암호 자바

한둥둥 2024. 4. 3. 22:54

https://school.programmers.co.kr/learn/courses/30/lessons/155652

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

해당 문제는 그리 어려운 문제는 아니였다. 하지만 한바퀴돌고 또 한바퀴를 돌 수 있는점 즉, 두바퀴까지도 가능하다는 점을 인지못하여 RuntimeException이 발생하였다. 

실패코드를 봐보자..! 이를 인식했으면 더 빨리 풀었을텐데 아깝다.

 

해당 문제는 내가 멘토로 활동하고 있는 곳에서 많은 수강생분들이 프로그래머스를 풀고 있는거 같아 혹시 모르는 마음에 나도 풀고 있다. 

 

class Solution {
    public String solution(String s, String skip, int index) {
        StringBuilder answer = new StringBuilder();
        boolean []skipCheckArr = new boolean[26];
        
        
        for(char c : skip.toCharArray()){
            int skipIndex = c - 'a';
            skipCheckArr[skipIndex] = true;
        }
        
        for(char c : s.toCharArray()){
            int startIndex = c - 'a';
            int alphaCount = 0;
            int count =0;
            int curIndex=0;
            while(count<=index){
                curIndex = startIndex + alphaCount;
                if(curIndex>=26) curIndex-=26;
                if(skipCheckArr[curIndex]) {
                    alphaCount++;
                    continue;
                }
                alphaCount++;
                count++;
            }
            char ch = (char)(curIndex + 97);
            answer.append(ch);
        }
       
        return answer.toString();
    }
}

해당 코드에서 문제가 되었던 부분은 curIndex>=26이 넘는다면 -26을 빼주는 부분에서 해당 두바퀴를 고민하지 않아  3 번 , 17번, 18, 19번 케이스에서 탈락되었다. 

 

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        StringBuilder answer = new StringBuilder();
        ArrayList<Character> arrayList = new ArrayList<>();
       
        for(int i=0;i<26;i++){
            arrayList.add((char)(i+97));
        }
       
        for(Character c : skip.toCharArray()) {
            arrayList.remove(c);
        }
        
        for(Character c : arrayList){
            System.out.print(c);
        }
        
        for(Character c : s.toCharArray()){
          int targetIndex  = arrayList.indexOf(c);
          int num = (targetIndex + index) % arrayList.size();
          answer.append(arrayList.get(num));  
        }
        return answer.toString();
    }
}

 

성공한 케이스의 코드이다.  가장 우선적으로 간단하게 길이가 얼만큼 삭제되어 배열이 들어올지 모르기 때문에 ArrayList를 통하여 값을 담아주었다. 그 후, add를 통하여 각각의 char값을 담아주었으며 여기서 remove를 통해서 값을 삭제해주었다. 

 

for문을 통해서 값을 도는데 targetIndex에서 arrayList에 있는 해당 값을 index와 더해주었는데 아스키 코드 값인 int로 더해주어 문제가 발생하였었다. 이 후 잘생각해보니 삭제한 값은 들어오지 않는다는 것을 알게되어 targetIndex를 arrayList.indexOf에서 값을 찾아 index와 더해주어 size()로 나누어 주었다. 

 

알고리즘 너무 재밌네.. 풀다보니깐 계속 풀게된다...