보라코딩

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

프로그래머스 (java)

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

new 보라 2024. 6. 14. 20:03

처음에는 문자를 숫자로 변환하려고 했는데 다시 또 문자로 변환하고.. 그럼 매우 복잡해져서

char로 처리하는 것이 훨씬 편하다.

이중 for 문으로 처리할 필요가 없었따!!!

 

 

index를 빼는 방식으로 while문 조건을 걸어 진행하는 것과

toCharArray()로 char 배열로 만드는 것을 익혔다!

set.contains로 한번에 확인할 수 있는 점도 매우 편리하다 :)

 

 

 

 

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        
        // answer을 StringBuilder로!!
        StringBuilder answer = new StringBuilder();
        
        // 중복될 수도 있으니 Skip을 Set으로 
        Set<Character> skipSet = new HashSet<>();
        
        for (char c : skip.toCharArray()) {
            skipSet.add(c);
        }
                
        // toCharArray 이용해서 굳이 숫자로 변경하지 말고 char배열 하나씩 꺼내오기
        for(char cha : s.toCharArray()) {

            int shifts = index;
            char newChar = cha;
            
            // shifts가 0이 되면 while문 그만
            while(shifts > 0) {
                newChar++;
                
                // 이 조건을 꼭 줘야함!
                if (newChar > 'z'){
                    newChar = 'a';
                }
                
                // set으로 contains를 사용하면 편하게 찾을 수 있다!
                if (!skipSet.contains(newChar)){
               // 주어진 index를 하나씩 빼는 방식으로
                    shifts--;
                }
            }
            answer.append(newChar);
        }
        return answer.toString();
    }
}

 

 

 


훨씬 더 짧은 다른 사람 풀이

 

class Solution {
    public String solution(String s, String skip, int index) {
        StringBuilder answer = new StringBuilder();

        for (char letter : s.toCharArray()) {
            char temp = letter;
            int idx = 0;
            while (idx < index) {
                temp = temp == 'z' ? 'a' : (char) (temp + 1);
                if (!skip.contains(String.valueOf(temp))) {
                    idx += 1;
                }
            }
            answer.append(temp);
        }

        return answer.toString();
    }
}