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

Yujin·2025년 6월 18일

CodingTest

목록 보기
2/51

문제

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

문제 접근 방법


1. skip해야하는 문자들을 HashSet을 이용해 저장
2. s를 배열로 저장 후 index만큼 증가시킴 -> count를 이용해 while문을 사용해 count가 index보다 작을때 까지 반복하도록 함
3. - z보다 넘어갈 경우 a로 초기화
   - skipSet에 있는 값을 포함할 경우 count에 반영하지 않는다.
4. 이렇게 바뀐 값을 answer에 하나하나 더함

처음 코드

// A1. 아스키코드 
// 문자열 s의 각 알파벳을 하나씩 읽어와서 배열 ch 에 저장 -> index만큼 증가시킴(만약 증가하먄서 skip의 값을 만나면 +1) (만약 x가 넘어가면 x-a만큼 빼서 a로 돌아옴)
//skip의 문자열을 하나씩 읽어와서 배열 sk에 저장 -> sk에 해당되면 +1

class Solution {
    public String solution(String s, String skip, int index) {
        char[] ch = s.toCharArray();
        char[] skipArray = skip.toCharArray();
        int[] ascCh = new int[ch.length];
        int[] ascSkip = new int[skipArray.length];
        
        for(int i = 0; i < skipArray.length; i++){
            ascSkip[i] = (int)skipArray[i];
        }
        for(int i = 0; i < ch.length; i++){
            ascCh[i] = ((int)ch[i]) + 5;
            for(int k : ascSkip){
                if(ascCh[i] == k)
                    i ++;
            }
            ch[i] = (char)ascCh[i];
        }
        String answer = new String(ch);        
        return answer;
    }
}

컬렉션을 이용하지 않고 배열로 풀어보려고 했는데, 알고리즘의 오류,,,,실패,,,,,

최종 코드

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        
        //skipSet에 skip의 값을 하나하나 넣어줌
        HashSet<Character> skipSet = new HashSet<>();
        for(char c : skip.toCharArray()){
            skipSet.add(c);
        }
        
        //문자열을 계속 추가해야하는 상황에서는 String 보다 StringBuilder를 사용하는데
        // 메모리상 효율적!
        StringBuilder answer = new StringBuilder();
        //index의 크기만큼 s의 값들을 증가시킴
        for(char c : s.toCharArray()){
            char newChar = c;
            int count = 0;
            while(count < index){
                newChar++;

                if (newChar > 'z')
                    newChar= 'a';     
                //skipSet에 포함되어 있는 값을 만날시 count 값에 포함 X
                if(!skipSet.contains(newChar))
                    count++;
            } 
            answer.append(newChar);
        }
        
        return answer.toString();
    }
}

0개의 댓글