인프런 커뮤니티 질문&답변

주노님의 프로필 이미지
주노

작성한 질문수

자바 코딩테스트 - it 대기업 유제

7. "비밀 번호" 코드 해설

"비밀번호" 문제 확인 부탁드립니다!

작성

·

83

0

안녕하세요! 비밀번호 문제를 다음과 같이 풀었는데 확인 한번 부탁드려도될까요~?

class Solution {

    public int solution(int[] keypad, String password) {
        int answer = 0;
        char[] pw = password.toCharArray();
        int[] index = new int[pw.length];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < pw.length; j++) {
                if (pw[j] - '0' == keypad[i]) {
                    index[j] = i;
                }
            }
        }

        for (int i = 0; i < index.length - 1; i++) {
            int curr = index[i];
            if (curr == index[i + 1]) {
                continue;
            }
            if (curr % 3 == 0) { // left
                if (index[i + 1] - curr == -3 || index[i + 1] - curr == -2 || index[i + 1] - curr == 1 ||
                    index[i + 1] - curr == 3 || index[i + 1] - curr == 4) {
                    answer++;
                } else {
                    answer += 2;
                }
            } else if (curr % 3 == 1) { // center
                if (index[i + 1] - curr >= -4 && index[i + 1] - curr <= 4) {
                    answer++;
                } else {
                    answer += 2;
                }
            } else if (curr % 3 == 2) { // right
                if (index[i + 1] - curr == -4 || index[i + 1] - curr == -3 || index[i + 1] - curr == -1 ||
                    index[i + 1] - curr == 2 || index[i + 1] - curr == 3) {
                    answer++;
                } else {
                    answer += 2;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Solution T = new Solution();
        System.out.println(T.solution(new int[]{2, 5, 3, 7, 1, 6, 4, 9, 8}, "7596218"));
        System.out.println(T.solution(new int[]{1, 5, 7, 3, 2, 8, 9, 4, 6}, "63855526592"));
        System.out.println(T.solution(new int[]{2, 9, 3, 7, 8, 6, 4, 5, 1}, "323254677"));
        System.out.println(T.solution(new int[]{1, 6, 7, 3, 8, 9, 4, 5, 2}, "3337772122"));
    }
}

0 1 2

3 4 5

6 7 8

패스워드의 각 문자에 대해 인덱스 번호를 구한 뒤 왼쪽, 가운데, 오른쪽임에 따라 다음 값과의 차이를 비교하여 +1인지 +2인지 구분하는 형태로 코드를 작성해봤습니다.

 

강사님이 풀이해주신 방식과는 다소 차이가 있어보여서 어떤 방식이 괜찮은지 혹은 위 방식에 문제점이 있는지 궁금하여 질문 올려봅니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

비밀번호 문제에 대한 님의 접근 방식을 살펴보았습니다.
제공해주신 코드는 주어진 키패드 배열과 비밀번호 문자열을 이용하여,
비밀번호의 각 숫자가 키패드에서 얼마나 떨어져 있는지를 계산하여 이동 횟수를 구하는 알고리즘입니다.

코드의 로직을 살펴본 결과, 대체적으로 올바른 접근 방식을 사용하셨습니다.
키패드의 숫자 리맵핑(index 재구성), 숫자 간 이동 거리 계산 로직에서의 조건 분기 처리 등이 적절해 보입니다.
다만, 정확한 동작 여부는 입력 값과 함께 테스트 케이스를 통해 확인해보는 것이 좋겠습니다.

하지만 코드의 정확성이나 효율성 측면에서 더 개선할 수 있는 부분이 있는지,
또는 강사님의 풀이 방식과 비교했을 때의 차이점에 따른 장단점은 구체적인 풀이 방식을 알아야 비교 분석할 수 있습니다.

키패드의 위치를 좌표로 생각하고 거리를 계산하는 방식,
또는 더 수학적이고 효율적인 접근 방식을 사용하는 등 다양한 방법이 있을 수 있습니다.

님의 코드가 정상 작동하며, 요구사항을 만족한다면 좋은 접근 방식 중 하나라고 볼 수 있습니다.
만약 성능 개선이 필요하거나 더 나은 접근 방식에 대해 고민하고 싶다면,
강사님의 풀이와 대비해보며 성능이나 가독성 면에서 어떤 차이가 있는지 분석해보는 것을 추천드립니다.

알고리즘 문제 해결 시 다양한 접근 방식을 시도해보는 것은 매우 좋은 학습 방법입니다.
더 궁금한 점이 있으시다면 언제든 질문해주시기 바랍니다.

주노님의 프로필 이미지
주노

작성한 질문수

질문하기