Dev/Algorithm

[프로그래머스] 대충 만든 자판 - Java

VIPeveloper 2024. 5. 20. 16:48
728x90
반응형

문제

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

 

프로그래머스

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

programmers.co.kr

 

생각

  • 해시를 이용하면 풀 수 있는 문제.
  • 음... 저장한다를 못봐서 코드를 이상하게 짯다. 이상하게 짠 코드를 첨부한다.
if(!hashMap.containsKey(targets[i].split("")[j])){
                    return new int[]{-1};
                }
// 1. keymap 배열을 순회하며 해시를 담을 때, 최소값을 담도록 하는 해시를 생성
// 2. targets 를 순회하며 해당 배열 값더하기

코드

import java.util.HashMap;
import java.util.LinkedHashMap;

public class Main {
    public static void main(String[] args) {
        System.out.println(solution(new String[]{"ABACD", "BCEFD"},new String[]{"ABCD","AABB"}));
        System.out.println(solution(new String[]{"AA"},new String[]{"B"}));
        System.out.println(solution(new String[]{"AGZ", "BSSS"},new String[]{"ASA","BGZ"}));
        System.out.println(solution(new String[]{"ABCE"},new String[]{"ABDE"}));
        System.out.println(solution(new String[]{"BC"},new String[]{"AC","BC"}));
    }
    public static int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        HashMap<String,Integer> hashMap = new LinkedHashMap<>();
        for (int i = 0; i < keymap.length; i++) {
            String[] row = keymap[i].split("");
            for (int j = 0; j < keymap[i].length(); j++) {
                String key = row[j];
                // 1. keymap 배열을 순회하며 해시를 담을 때, 최소값을 담도록 하는 해시를 생성
                hashMap.put(key, Math.min(j,hashMap.getOrDefault(row[j],Integer.MAX_VALUE)));
            }
        }

        for (int i = 0; i < targets.length; i++) {
            for (int j = 0; j < targets[i].length(); j++) {
                if(!hashMap.containsKey(targets[i].split("")[j])){
                    answer[i] = -1;
                    break;
                }
                answer[i] += hashMap.get(targets[i].split("")[j])+1;
            }
        }
        return answer;
    }
}

다른 사람 풀이

  • 흐름은 거의 비슷하다.
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        System.out.println(solution(new String[]{"ABACD", "BCEFD"},new String[]{"ABCD","AABB"}));
        System.out.println(solution(new String[]{"AA"},new String[]{"B"}));
        System.out.println(solution(new String[]{"AGZ", "BSSS"},new String[]{"ASA","BGZ"}));
        System.out.println(solution(new String[]{"ABCE"},new String[]{"ABDE"}));
        System.out.println(solution(new String[]{"BC"},new String[]{"AC","BC"}));
    }
    public static int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        HashMap<Character,Integer> map = new HashMap<>();

        for (String key : keymap) {
            for (int j = 0; j < key.length(); j++) {

                char ch = key.charAt(j);

                if (map.containsKey(ch)){
                    if(map.get(ch)>j){
                        map.replace(ch,j+1);
                    }
                }else{
                    map.put(ch,j+1);
                }
            }
        }

        for(int i=0; i< targets.length;i++){
            int sum = 0;
            for(int j=0; j<targets[i].length();j++){

                char ch = targets[i].charAt(j);

                if(map.containsKey(ch)){
                    sum+=map.get(ch);
                }else{
                    sum = -1;
                    break;
                }
            }
            answer[i] = sum;
        }

        return answer;
    }
}
728x90
반응형