Pccp준비하기 - 대충만든 자판, 덧칠하기

박경현·2024년 1월 14일
0

해쉬 맵과 수학을 이용하는 문제들을 풀었고 이와 관련되어서 내용들을 정리해보려고 한다
알고리즘은 어렵지 않았지만 스스로 생각을 너무 많이해서 어렵게 해결하려고 했었다..

역시 알고리즘은 단순하게 보고 구현해야해...

대충만든 자판

문제 설명 및 풀이

대충만든자판

여기서 핵심은 해쉬맵을 사용해서 알파벳이 가장 빨리 터치된 숫자를 적어놓는것이었다!

즉 ["ABACD", "BCEFD"] 이렇게 나왔다면, B는 처음 배열에서는 2번째에 있지만 두번째배열에서는 1번째에 위치하므로 B -> 1을 저장해야한다!

이걸 토대로 해쉬맵으로 각 알파벳의 최소 터치를 저장했고 각 targets의 문자를 돌면서 해쉬맵에 해당 알파벳이 있다면 targetCount를 그만큼 더해줬고, 없다면 그 자리에 -1을 저장했습니다

코드

import java.util.*;

class Solution {
	public int[] solution(String[] keymap, String[] targets) {
    	int [] answer = new int[target.length];
        
        HashMap<Character, Integer> keypad = new HashMap<>();
        for (int i = 0; i < keymap.length; i++) {
        	for (int j = 0; j < keymap[i].length(); j++) {
            	char key = keymap[i[.charAt(j);
                if (keypad.containsKey(key)) {
                	keypad.put(key, Math.min(keypad.get(key), j + 1));
                } else {
                	keypad.put(key, j + 1);
                }
            }
        }
        for (int i = 0; i < targets.length; i++) {
            int targetCount = 0;
            boolean flag = true;
            for (int j = 0; j < targets[i].length(); j++) {
                char t = targets[i].charAt(j);
                if (keypad.containsKey(t)) {
                    targetCount += keypad.get(t);
                } else {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                answer[i] = targetCount;
            }else {
                answer[i] = -1;
            }
        }
        // keypad.forEach((key, value) -> {
        //		System.out.println(key + " : " + value);
        //	});
    }
}

덧칠하기

문제 설명 및 풀이

덧칠하기 문제

풀이

문제의 경우 m미터인 롤러로 최소한으로 몇번 칠해서 section을 다 칠할 수 있는가에 대한 문제였다

처음에는 배열을 하나 만들까 하다가 단순한 수학으로 범위를 설정한 뒤 풀 수 있겠구나를 생각해서
수학으로 범위를 설정했습니다

int currentRange = section[i] + m - 1;

맨 처음부터 돌아가면서 만약에 currentRange안에 들어오면 다시 색칠할 필요 없으니 pass를 하고
currentRange 범위를 넘어가는 위치를 칠해야한다면 그 위치로 이동 후 칠해야하므로 answer++를 해주었습니다

코드

class Solution {
    public int solution(int n, int m, int[] section) {
        int answer = 1;
        
        int currentRange = section[0] + m - 1;
        for (int i = 1; i < section.length; i++) {
            if (currentRange < section[i]) {
                currentRange = section[i] + m - 1;
                answer++;
            }
        }
        return answer;
    }
}

피드백

레벨1.5정도의 어렵지 않은 문제였음에도 너무 깊게 생각하는 바람에 제대로 못풀었다

이 문제가 원하는 결과가 무엇이고 어떻게 하면 가장 단순하게 작성할 수 있는지 고민하고 풀자!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글