코딩테스트/프로그래머스

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

이덩우 2023. 5. 29. 10:38

- 문제설명

- 제한사항

- 예시 & 입출력 예

- 해결과정

  • 문제를 처음 접근할 때 이유없이 너무나 당연하게? 문자열을 배열로 바꿔서 풀어야겠다고 생각했다. 그래서 문자열을 배열로 바꿔주는 메소드를 작성하고 메인 메소드를 작성하다 보니, 쓸데없이 길어지는 느낌을 받았다.
  • 기능별로 쪼개서 메소드를 작성해주는 것도 좋지만, 이번 문제는 간단해서 그냥 메인 메소드에 한번에 쓰기로 했다.
  • 가장 안쪽 for문에서 index만큼 j를 증가시키면서 하나 하나 문자열의 일치를 확인하게 된다. index만큼 반복 확인하면서 만약 문자열의 일치가 발견된다면, 그 횟수만큼 index에서 더 나아가면서 추가로 확인해야한다.
  • 이 부분을 구현할 때, for문에서 이미 j < index 라고 고정된 범위를 지정해놨는데 문자의 일치가 판단돼서 추가로 나아가야하는 상황을 어떻게 구현할까 고민했다.
  • 처음엔 조건문을 j < index + count식으로 count라는 변수를 새롭게 추가해 문자의 일치가 발견되면 count를 증가시켜 조건문이 갱신되도록? 만들어봤는데 원하는대로 동작이 안됐다.
  • 그래서 '아 그럼 문자의 일치가 발견되면 j--를 시켜서 한번 더 돌게 만들면 되겠네' 라고 생각했지만, 처음 구현했던 문자열의 일치부분을 if(s[0] + j == skip.charAt()) 이런식으로 판단을 했어서, j--를 시켜봤자 비교값 자체도 돌아가게 돼버려서 원하는 결과를 얻지 못했다.
  • 그래서 s[0] + j 이 부분을 j와 관련이 없도록 수정했다. 솔루션을 보면 비교대상의 문자값을 아스키코드 값으로 변환시켜놓고, 내부 for문이 반복될 때마다 j와 상관없이 1씩 더해주는 모습을 볼 수 있다.
  • 이렇게 되면, 문자의 일치를 발견해서 j-- 행위가 이루어져도 아스키코드 값은 되돌아가지 않고 1씩 더해진다.
  • 추가로, 배열로 문제를 풀지않고 문자열로 접근하니 contains메소드를 활용할 수 있어 더욱 간단하게 풀 수 있었다.

- 솔루션

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
         String result = "";
         for(int i = 0; i < s.length(); i++) {
            char charac = s.charAt(i);
            for(int j = 0; j < index; j++) {    
                int num = (int) charac;
                num += 1;
                if(num > 122) num -= 26;
                
                charac = (char) num;
                if(skip.contains(Character.toString(charac))) j--; 
            }
            result += charac;
        }
        return result;
    }
}

- 배운점

  • for문의 변수 i, j를 직접 내부에서 사용해야만 하는건 아니다.
  • 해당 변수 i, j도 증감을 주면서 조작할 수 있다.