알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://school.programmers.co.kr/learn/courses/30/lessons/160586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Think🤔
LV0을 푸는데 너무 쉬워서 LV1로 넘어왔습니다.
주어지는 인자값은
String [] keymap 여기서 인자값이 "ABACD" 인 경우 한번 누르면 맨 처음 A , 두번은 B 이런식
String [] targets 이 요소는 "AABB" 이런식으로 들어가 있는데 ,
keymap에 있는 키를 가지고 targets의 문자를 최소로 눌러서 작성 하는 것
그러면 "ABACD" , "BCEFD" 라는 키가 있으면 "ABCD"는
A는 1번키에서 한번 누르면 되니깐 여기서 1
B는 2번키에서 한번 누르면 되니깐 여기서 1
C는 2번키에서는 두번 누르면 되니깐 여기서 2(1번키에서는 C를 누르려면 총 4번을 눌러야 하기때문에 2번)
D는 둘다 5번씩 눌러야 되니깐 여기서 누르면 됨
이거를 이제 생각해보면
targets에 있는 요소들을 하나씩 처리해야 되니깐 일단 첫번째 요소를 가져와서
keymap에 매칭해보면서 더 가까이에 있는 keymap을 이용해서 정답에 +를 해준 후 반환하면 된다.
3중 for문으로 하려했으나 너무 비효율적이고 keymap의 크기와 targets의 길이가 각각 100개인 점
100의 제곱인 10000번을 돌 수 있기 떄문에 이 방법말고 다른 방법을 참조해서 해보기로 한다.
HashMap을 사용해서 푸신 분들을 참조하여 적용해보기로 했다.
HashMap을 이용해서 하면 Character형과 int형을 이용해서 해당 문자열의 값이 작은 키 패드를 먼저 만들 수 있기 떄문
반복문을 이용해서 대충 만든 자판을 조합하여 새로운 자판을 만든다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[2];
HashMap<Character,Integer> hs = new HashMap();
for(String s : keymap){
for(int i=0; i<s.length(); i++){
hs.put(s.charAt(i) , Math.min(hs.get(s.charAt(i)) , hs.getOrDefault(s.charAt(i) , i)));
}
}
return answer;
}
}
여기까지 작성했는데 npe가 발생한다.. 뭐가 문젠지?
가독성을 위해 s.charAt(i) 는 일단 변수처리하는게 좋아보인다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[2];
HashMap<Character,Integer> hs = new HashMap();
for(String s : keymap){
for(int i=0; i < s.length(); i++){
char key = s.charAt(i);
hs.put(key , Math.min(hs.getOrDefault(key , Integer.MAX_VALUE) , i+1));
}
}
System.out.print(hs);
return answer;
}
}
npe가 발생하는 이유는 hs.get으로 가져올려고 하나 그 값이 존재하지 않아서 못가져오기 때문이다.
그럼 해당 코드를 수정해서 만약에 값이 없어서 가지고 오지 못하면 지금의 값을 넣어주고
못가져오면 제일 큰 값 Integer.MAX_VALUE값을 넣어 현재의 숫자를 넣어주게 Math.min을 이용한다.
여기 까지 하면 일단 hs는 새로운 자판이 되었다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
HashMap<Character,Integer> hs = new HashMap();
for(String s : keymap){
for(int i=0; i < s.length(); i++){
char key = s.charAt(i);
hs.put(key , Math.min(hs.getOrDefault(key , Integer.MAX_VALUE) , i+1));
}
}
for(int i=0; i<targets.length; i++){
int cnt = 0;
for(int j=0; j<targets[i].length(); j++){
char key = targets[i].charAt(j);
if(hs.containsKey(key)){
cnt += hs.get(key);
}
}
if(cnt == 0){
answer[i] = -1;
}else{
answer[i] = cnt;
}
}
return answer;
}
}
이렇게 하니 테스트 14~23번은 전부 실패한다...
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
HashMap<Character,Integer> hs = new HashMap();
for(String s : keymap){
for(int i=0; i < s.length(); i++){
char key = s.charAt(i);
hs.put(key , Math.min(hs.getOrDefault(key , Integer.MAX_VALUE) , i+1));
}
}
for(int i=0; i<targets.length; i++){
int cnt = 0;
for(int j=0; j<targets[i].length(); j++){
char key = targets[i].charAt(j);
if(hs.containsKey(key)){
cnt += hs.get(key);
}else{
cnt = 0;
break;
}
}
if(cnt == 0){
answer[i] = -1;
}else{
answer[i] = cnt;
}
}
return answer;
}
}
입력값 〉 ["BC"], ["AC", "BC"]
기댓값 〉 [-1, 3]
테스트 케이스를 추가하고 , 다른 반례를 이용해서 예외를 추가 하였다.
단어중에 누르는거만 생각했지 없는 값이 있으면 바로 끝내줘야 한다.
Solution✍
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
HashMap<Character,Integer> hs = new HashMap();
for(String s : keymap){
for(int i=0; i < s.length(); i++){
char key = s.charAt(i);
hs.put(key , Math.min(hs.getOrDefault(key , Integer.MAX_VALUE) , i+1));
}
}
for(int i=0; i<targets.length; i++){
int cnt = 0;
for(int j=0; j<targets[i].length(); j++){
char key = targets[i].charAt(j);
if(hs.containsKey(key)){
cnt += hs.get(key);
}else{
cnt = 0;
break;
}
}
if(cnt == 0){
answer[i] = -1;
}else{
answer[i] = cnt;
}
}
return answer;
}
}
Review🤩
굳뜨
'Algorithm' 카테고리의 다른 글
[프로그래머스] [PCCE 기출문제] 9번 / 이웃한 칸 (1) | 2024.01.15 |
---|---|
[프로그래머스] 둘만의 암호 (0) | 2024.01.11 |
[프로그래머스] 아이스 아메리카노 (0) | 2024.01.05 |
[프로그래머스] 배열 두 배 만들기 (0) | 2024.01.05 |
[프로그래머스] 배열 원소의 길이 (0) | 2024.01.05 |