JAVAIARY

프로그래머스) 둘만의 암호 본문

examplePractice

프로그래머스) 둘만의 암호

shiherlis 2023. 2. 25. 19:24

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

 

프로그래머스

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

programmers.co.kr

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

		for (int i = 0; i < s.length(); i++) {
			char target = s.charAt(i); // i번째 문자

					int idxCnt = 0;
				// idxCnt 가 index 와 같지 않고, 현재 target값이 skip에 포함되면 재실행
				while (idxCnt != index || skip.contains(Character.toString(target)) ) {
				/*
				 * 	skip에 target값이 들어있는지 확인
				 * 	skip에 있는 문자가 아니면 idxCnt와 target 모두 증가
				 *	skip에 있는 문자이면 idxCnt를 건너뛰고 target만 증가
				 */
					if (!skip.contains(Character.toString(target))) {
						idxCnt++;
						target++;
					}else target++;
					target = target>122? target-=26: target;
					
			}
			answer = answer.concat(Character.toString(target));
		}
		return answer;
	}
}
  • 처음에 ascii 코드로 인덱스만큼 더해준 다음, 처음 코드와 코드+인덱스 값 사이에
    스킵값이 있으면 스킵값의 개수만큼 더해주는 식으로 풀려고 했다.
  • 이렇게 했을 경우 인덱스 마지막에 연속된 스킵값이 있을 경우 그 연속값을 건너뛰지 못해 반례가 생김
  • 그래서 스킵값일 경우 인덱스카운트를 증가시키지 않고
  • 인덱스카운트가 인덱스에 도달할 때 까지 반복시키는 방법으로 진행
public static void main(String[] args) {
		String s = "ybcde";
		String skip = "az";
		int index = 1;

//		String s = "zzzzz";
//		String skip = "bcdefghijk";
//		int index = 20;
		
		
		System.out.println(solution(s, skip, index));
	}

다른풀이 생각해 본 것

  • 알파벳 배열에서 스킵값을 뺀 새로운 배열 생성
  • indexOf로 찾는 알파벳의 인덱스 n을 구해서
    (n +index)% 알파벳 배열 길이 
    계산을 통해 나오는 나머지가 찾는 알파벳의 인덱스가 될 것 
public static String solution(String s, String skip, int index) {
		String answer = "";
		// skip에 포함된 문자가 빠진 알파벳 배열 생성
		ArrayList<Character> alphabet = new ArrayList<>();
			for (int j = 0; j < 26; j++) {
				if (!skip.contains(Character.toString(j + 97))) {
					alphabet.add((char) (j + 97));
				}
			}
		System.out.println(alphabet);
		
		for (int i = 0; i < s.length(); i++) {
			int tgtIdx = alphabet.indexOf(s.charAt(i));	// s의 i번째 문자의 알파벳 배열에서의 인덱스값
			//(tgtIdx+index) % alphabet.size() 로 변환된 문자열의 인덱스 값을 얻음
			char converted = (char)alphabet.get((tgtIdx+index) % alphabet.size());
			answer = answer.concat(Character.toString(converted));
		
		}
		return answer;
	}
  • 첫 번째 풀이가 먼저 떠올라서 아득바득 풀어보려고 애썼던 거였는데
    두 번째 풀이가 더 간단하고 처리 속도도 빠름!