본문 바로가기
Programmers/Lv.1

[프로그래머스] Lv.1 대충 만든 자판 JAVA 풀이

by Poorm 푸름 2025. 3. 6.

문제 Lv.1 대충 만든 자판 (해시, 맵)

키 하나에 여러 문자가 할당된 경우 동일한 키를 연속해서 누르면 할당된 순서대로 문자가 바뀝니다

할당된 문자들이 담긴 키 배열 keymap / 입력하려는 문자열이 담긴 배열 targets

목표한 문자를 담을 수 없다면 -1 출력


(예시)
1번 키에 "A", "B", "C" 문자가 할당 -> 1번 키를 한 번 누르면 "A", 두 번 누르면 "B", 세 번 누르면 "C"

 

 

[알고리즘 선택 이유]

해당문제는 무언가를 찾아서 값을 내는 경우 A를 입력하기 위해 눌러야 할 횟수처럼 각 알파벳마다 정해진 값이 있다

그렇다면 키-밸류 형식의 맵을 사용하자!

 

 1) 맵 선언

  :  Map<타입타입변수명 = new HashMap<>();

     (ex) Map<String,Integer> m = new HashMap<>();

 

  :  앞에는 Map, 뒤에는 HashMap 을 쓴 이유는 Map이 인터 페이스이기 때문이다

     (인터페이스는 선언만 가능, 객체 생성은 불가능)

      때문에 자식인 HashMap으로 객체를 생성한다.

     (HashMap은 부모인 Map의 메소드들을 강제 상속받음)

 

  2) 맵에 데이터 저장


  :  변수명.put("Key", "Value");

     (ex) m.put("홍길동", "1")

     * 이때 만약 같은 키에 다른 값을 또 저장한다면 맨 마지막 데이터가 덮어쓴다

 

 

[함수 1] String.toCharArray()

  • String(문자열)을 한 글자씩 쪼개서 char형 배열에 집어넣어주는 친절한 메소드

    String s1 = "Hello World";
    char[] charArr = s1.toCharArray();

 

[코드]

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        Map<Character,Integer> map = new HashMap<>();
        int[] answer = new int[targets.length];
        for(String k:keymap){
            for(int i=0;i<k.length();i++){
                char c = k.charAt(i);
                if(!map.containsKey(c) || i+1<map.get(c)){
                    map.put(c, i+1);
                }
            }
        }
        for(int i=0;i<targets.length;i++){
            int count = 0;
            for(char c: targets[i].toCharArray()){
                if(map.containsKey(c)){
                    count+=map.get(c);
                }
                else{
                    count = -1;
                    break;
                }
            }
            answer[i] = (count > 0) ? count:-1;
        }
        return answer;
    }
}

[해설]

Map<Character,Integer> map = new HashMap<>();  맵선언
int[] answer = new int[targets.length];  출력할 배열 선언
for(String k:keymap){  keymap 자판이 여러개라 순회돌기
       for(int i=0;i<k.length();i++){  
                char c = k.charAt(i);  하나의 자판(문자열 배열) 에서 문자뽑기
                if(!map.containsKey(c) || i+1<map.get(c)){  맵에 값이 없거나 현재 누르는 횟수가 저장된 값보다 적을 경우
                    map.put(c, i+1);  현재 누른 횟수 값으로 갱신 (i+1은 인덱스가 0부터 시작해서 +1 해준 것)
                }
       }
}
        

for(int i=0;i<targets.length;i++){  출력할 배열 탐색 answer 인덱스 때문에 for-each 방식 사용안함
       int count = 0;  
       for(char c: targets[i].toCharArray()){  출력할 배열에서 문자 뽑기
              if(map.containsKey(c)){  맵에 값이 있으면 count에 넣기
                    count+=map.get(c);
              }
              else{  값이 없으면 만들 수 없으므로 -1 출력하고 break
                    count = -1;
                    break;
              }
       }
       answer[i] = (count > 0) ? count:-1;  count가 -1이 아니였으면 count출력하기
}
return answer;  정답


 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr