본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 대충 만든 자판 / JAVA]

by KDW999 2023. 3. 1.

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

문제를 풀 때 생각해야 될 부분 중에서 여러 키에서 원하는 문자를 만들 수 있을 때 어느 키를 누르는 게 최소 횟수인지 구해야하는데 이 부분에서 시간을 많이 잡아먹어 풀지 못하고 다른 분들의 풀이를 보았다.

이 부분을 제외하면 key와 만드려는 문자들을 하나씩 비교해가며  같을 경우 숫자로 카운팅하여 return, 카운팅 숫자가 0이면 만들 수 없는 문자열이라 -1을 return하는 방식으로 접근하였다.

 

다른 사람 풀이

1) 내가 접근한 방식과 비슷한 형태로 이 분은 최소 횟수 구하는 부분을 따로 메서드로 만들어서 구하였다.

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 = minPress(keymap, targets[i].charAt(j)); // press 메서드는 구하려는 문자를 키를 최소로 눌러서 구한 횟수를 return
				if (count == -1) { // press 메서드는 keymap과 targets의 문자들을 하나씩 비교해서 같은 문자가 없으면 -1 return해줌
					sum = -1; 
					break;
				}
				sum += count; // targets의 한 요소에 있는 문자들의 최소 횟수를 다 구한 뒤 합산
			}
			answer[i] = sum; 
		}

        return answer;
    }
    
    private int minPress(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) { // 구하려는 문자와 처음으로 같은 문자를 찾았을 경우
						min = j+1;
					} 
					else if (min > j) { // 같은 문자라도 최소 횟수를 위해서 더 앞에 있는 문자의 순서 저장 
						                // min > j+1이 아닌 이유 → j+1과 비교하면 바로 다음 순서에 오는 같은 문자는 연산을 못함
						min = j+1;
					}
					break; // 만드려는 한 문자의 최소 횟수 구했으니 다음 문자로
				}
			}
		}
    	
    	return min;
    }
}

 

 

2) indexOf() 메서드가 원하는 인덱스의 위치를 찾아주고 원하는 인덱스가 없으면 -1 return 해주는 기능이라 이 문제에 유용하다 느껴졌다.

public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];

        Set<String> set = new HashSet<>(Arrays.asList(keymap)); // keymap 배열을 List로 변경한 걸 초기값으로 삽입
        set.remove(""); // 뭘까.. 없어도 정답인데 제출할 때 지우는 걸 깜빡한건가?

        for (int i = 0; i < targets.length; i++) { // targets

            for (int l = 0; l < targets[i].length(); l++) { // char
                int k = 101; // 키의 원소의 길이가 100이하라 101로 잡은 듯?

                for (String j : set) { // set
                    int index = j.indexOf(targets[i].charAt(l)); // indexOf()는 문자열에서 특정 인덱스를 찾는 메서드, 못찾으면 -1 반환
                                                                 // 만들 수 있는 문자열인지 쉽게 확인 가능
                                                                 // indexOf()는 앞에서 부터 탐색, lastIndexof()는 뒤에서 부터 탐색

                    if (index == -1) continue;
                    else if (index < k) k = index; // 같은 문자가 나왔을 경우 k에 저장해둔 값과 비교하여 더 빠른 순서의 문자를 저장
                }


                if (k == 101) { // 101일 경우 만들 수 없는 문자열이라 -1 저장
                    answer[i] = -1;
                    break;
                } 
                else answer[i] += (k + 1); // 만들 수 있는 문자일 경우 배열의 한 요소에 k값들 저장
            }
        }
        return answer;
    }

댓글