Welcome! Everything is fine.

[프로그래머스/Lv.1] 둘만의 암호 - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 둘만의 암호 - Java

개발곰발 2024. 4. 29.
728x90

📌 문제

 

프로그래머스

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

programmers.co.kr

📌 풀이

문자열 계산 문제인데 skip에 포함되는 문자는 건너뛰어야 하는 조건이 있었다. 주의할 점은 index만큼의 뒤의 알파벳이 'z'를 넘어갈 경우 다시 'a'로 돌아가야 한다. 아스키 코드를 이용해서 풀면 되는군! 하고 바로 떠올랐지만 어쩐지 자꾸 꼬여가는 코드로 머리가 아팠던 문제였다..

흐름을 차근차근 정리해보면 다음과 같다.

  • 문자열 s를 한 글자씩 순회한다.
    • 이중 for문으로 index번만큼 반복한다.
      • 한 바퀴 돌 때마다 s.charAt(i) + 1씩 증가한다.
      • 만약 증가한 문자가 'z'(122) 보다 크다면 해당 문자에서 26을 뺀다.(123 - 97 = 26)
      • 문자열 skip에 해당 문자가 포함되어있다면 j를 1 감소시킨다.(skip된 문자만큼 반복문을 더 돌 수 있도록)
    • 두 번째 반복문이 끝나면 s.charAt(i)를 StringBuilder에 붙인다.
  • 완성된 StringBuilder를 문자열로 변환 후 반환한다.

이 과정을 코드로 바꾸면 이렇게 된다.

for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    for (int j = 0; j < index; j++) {
        c++;
        if (c > 'z') c -= 26;
        if (skip.contains(String.valueOf(c))) j--;
    }
    answer.append(c);
}

 

분명 생각한 방향은 정답과 같은데 코드로 구현하니 생각한대로 나오지 않았다. 막상 답을 보면 쉬운데..대충 생각하고 짜지 말고 종이에 쓰면서 흐름을 더 명확히 한 후 짜야겠다는 생각을 했다.

📌 전체 코드

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        StringBuilder answer = new StringBuilder();
        
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            for (int j = 0; j < index; j++) {
                c++;
                if (c > 'z') c -= 26;
                if (skip.contains(String.valueOf(c))) j--;
            }
            answer.append(c);
        }
        
        return answer.toString();
    }
}