프로그래머스 | 대충 만든 자판 (Java)

mul·2023년 2월 24일
0

알고리즘

목록 보기
28/65
post-custom-banner

🔒 문제

프로그래머스 Lv.1 연습문제 대충 만든 자판

🔑 해결

1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어질 때, 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return하는 solution함수를 작성하는 문제이다.

target에 저장된 문자열을 작성하기 위해 문자 하나에 대해 키를 최소 몇 번 눌러야하는지 계산하여 합한 다음 answer 배열에 저장한다. 키를 최소 몇 번 눌러야 하는지는 press(keymap배열, 탐색할 문자) 함수를 만들어 계산했다.

  1. targets의 length만큼 for문을 돌리고 각 target[i]마다 sum을 0으로 초기화
  2. target[i]의 각 문자 하나씩 탐색하기 위해 target[i]의 길이(length())만큼 for문을 돌린다
  3. target[i]의 j번째 문자를 사용하기 위해 눌러야할 최소 횟수(count)를 press함수를 통해 계산
    3-1. keymap에 저장된 값만큼 for문을 돌려, 각 keymap[i]를 앞에서부터 탐색하면서 c와 같으면 멈추고, for문을 돌면서 저장한 최솟값(min)보다 작으면 최솟값(min)에 j+1을 저장한다.
    4-1. 계산된 최소 횟수(count)가 -1이라면 목표 문자열을 작성할 수 없으므로 sum에 -1을 저장하고 for문을 종료한다.
    4-2. -1이 아니라면 count를 sum(target[i]를 작성하기 위해 키를 누르는 횟수)에 더하기
  4. 합산된 sum을 answer[i]에 저장

🔓 코드

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        
        for (int i = 0; i < targets.length; i++) {
        	int sum = 0;
			for (int j = 0; j < targets[i].length(); j++) {
				int count = press(keymap, targets[i].charAt(j)); // targets[i]의 j번째 문자 쓰기 위해 키를 누르는 최소 횟
				if (count == -1) { // keymap에서 targets[i].charAt(j)를 찾을 수 없으면 -1을 return
					sum = -1; // 목표 문자열을 작성할 수 없으므로 sum에 -1 저장
					break;
				}
				sum += count;
			}
			answer[i] = sum;
		}
        
        return answer;
    }
    
    private int press(String[] keymap, char c) {
    	int min = -1;
    	for (int i = 0; i < keymap.length; i++) {
    		for (int j = 0; j < keymap[i].length(); j++) {
				if (keymap[i].charAt(j) == c) {
					if (min == -1) { // c와 같은 문자를 처음 찾았다면(아직 min이 -1로 초기화된 상태라면)
						min = j+1;
					} else if (min > j) { // min이 -1이 아니고, j가 min보다 작다면
						min = j+1;
					}
					break;
				}
			}
		}
    	
    	return min;
    }
}
post-custom-banner

0개의 댓글