[Java] 프로그래머스 : 둘만의 암호

728x90

[Java] 프로그래머스 : 둘만의 암호

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

 

프로그래머스

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

programmers.co.kr


접근

문자열 s를 문자 단위로 순회하면서 각각의 값을 Strnig으로 변환하여 skip에 값이 있는 경우를 건너뛰도록 하는 방식으로 접근했다.

 

코드1

class Solution {
    public String solution(String str, String skip, int index) {
        StringBuilder sb = new StringBuilder();
        
        for (char c : str.toCharArray()) {
            int cnt = 0;
            String s = "";
            int num = (int)c;
            while (cnt < index) {
                if ((char)num == 'z') { // 현재 문자가 z면 a의 아스키코드로 변환
                    num = 97;
                }
                else num++; // 아니면 그냥 아스키 코드 값을 증가시킴
                s = String.valueOf((char) num);
                if (skip.contains(s)) {
                    continue;
                }
                else {
                    cnt++;
                }
            }
            sb.append(s);
        }
        return sb.toString();
    }
}

위에 코드가 좀더 직관적인 것 같긴 하지만 불필요하게 선언된 변수가 너무 많아서 아래와 같이 개선했다.

 

c = (char) ( (c - 'a' + 1) % 26 + 'a');

문자 c는 아스키코드 값으로 97(a) ~ 122(z) 범위내로 한정시켜야 하므로, 위와 같은 방식을 사용했다.

 

코드2

class Solution {
    public String solution(String str, String skip, int index) {
        StringBuilder sb = new StringBuilder();
        
        for (char c : str.toCharArray()) {
            int cnt = 0;
            
            while (cnt < index) {
                c = (char) ( (c - 'a' + 1) % 26 + 'a');
                if (!skip.contains(String.valueOf(c))) {
                    cnt++;
                }
            }
            sb.append(c);
        }
        return sb.toString();
    }
}

 

728x90