문제 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
'Programmers > Lv.1' 카테고리의 다른 글
[프로그래머스] Lv.1 바탕화면 정리 JAVA 풀이 (0) | 2024.06.28 |
---|---|
[프로그래머스] Lv.1 공원 산책 JAVA 풀이 (0) | 2024.06.28 |
[프로그래머스] Lv.1 크레인 인형뽑기 JAVA 풀이 (0) | 2023.10.02 |
[프로그래머스] Lv.1 덧칠하기 JAVA 풀이 (0) | 2023.08.24 |
[프로그래머스] Lv.1 추억 점수 JAVA 풀이 (2) | 2023.08.21 |