본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 160586번: 대충 만든 자판 [Java]

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

 

프로그래머스

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

programmers.co.kr

1. 코드

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        for(int i = 0; i < targets.length; i++) {
            for(char c : targets[i].toCharArray()) {
                int press = Integer.MAX_VALUE;
                for(String k : keymap) {
                    for(int j = 0; j < k.length(); j++) {
                        if(c == k.charAt(j)) {
                            press = Math.min(press, j);
                            break;
                        }
                    }
                }
                if(press == Integer.MAX_VALUE) {
                    answer[i] = -1;
                    break;
                }
                else answer[i] += press + 1;
            }
        }
        return answer;
    }
}

2. 설명

for(char c : targets[i].toCharArray()) {
    int press = Integer.MAX_VALUE;
    for(String k : keymap) {
        for(int j = 0; j < k.length(); j++) {
            if(c == k.charAt(j)) {
                press = Math.min(press, j);
                break;
            }
        }
    }

반복문을 통해서 targets의 문자와 keymap의 문자를 비교하는데 press의 초기값은 가장 큰 수를 저장하며 Math.min() 메서드를 통해서 가장 적은 수를 press를 저장하면 해당 키를 최소로 누르는 수를 저장하게 됩니다.

    if(press == Integer.MAX_VALUE) {
        answer[i] = -1;
        break;
    }
    else answer[i] += press + 1;
}

만약 press의 값이 처음 선언했을 때와 동일하다면 targets의 문자가 keymap에 존재하지 않다는 것을 의미하기에 answer에 -1을 저장한 뒤 반복문을 빠져나옵니다. 왜냐하면 이미 targets에 해당 문자가 1개라도 존재하지 않으면 -1을 반환하기 때문입니다.

만약 아니라면 answer에 press에서 1만큼 증가된 값을 합해주며 반복문을 계속 진행합니다.

3. 정리

  1. keymap에 존재하지 않는 문자를 가지고 있는 문자열은 -1을 반환한다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges