[프로그래머스] 17 : 문자열 나누기 | 대충 만든 자판 | 둘만의 암호

서예진·2024년 1월 31일
0
post-custom-banner

목차

▸ 문자열 나누기
▸ 대충 만든 자판
▸ 둘만의 암호


💡문자열 나누기 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 문자열 나누기

▼ 내 풀이

  • 우선, while문을 활용하였고 i가 문자열의 길이를 넘어서 접근하려고하면 break를 걸어두었다.
  • x와 비교하면서 같으면 x의 수를 +1하고 다르면 notx의 수를 +1했다.
  • 두 수의 숫자가 같으면 answer를 +1하고 이때 만약 남은 문자가 하나여도 answer +1하게 했다.
[오답 코드]
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int solution(String s) {
        int answer = 0;
        int xCnt = 1;
        int notxCnt = 0;
        char[] charArray = s.toCharArray();
        char x = charArray[0];
        int i = 0;
        
        while(true){
            i++;
            if(i==charArray.length){
                    break;
                }
            if(x == charArray[i]){
                xCnt++;
            }else if(x != charArray[i]){
                notxCnt++;
            }
            if(xCnt==notxCnt){
                answer++;
                i++;
                if(i==charArray.length){
                    break;
                }else if(i==charArray.length-1){
                    answer++;
                }
                x = charArray[i];
                xCnt = 1;
                notxCnt = 0;
            }
        }
        return answer;
    }
}
  • 위의 코드는 7개의 테스트에서 실패가 떴다.
  • charAt 메서드를 사용해서 코드를 조금 더 간결하게 짜보았다.
  • 위 코드의 문제는 x 수와 notx 수가 같은지 마지막에 비교한게 문제였다. 따라서 먼저 두 수가 같은지 비교한 후에 나머지 과정을 거치게 했다.
[수정 코드]
class Solution {
    public int solution(String s) {
        int answer = 0;
        int xcnt = 0;
        int notx = 0;
        char x = s.charAt(0);
        
        for(int i = 0; i < s.length(); i++){
            if(xcnt == notx){
                answer++;
                x = s.charAt(i);
            }
            if(x == s.charAt(i)){
                xcnt++;
            }else if(x != s.charAt(i)){
                notx++;
            }
        }
        
        return answer;
    }
}

💡대충 만든 자판 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 대충 만든 자판

▼ 내 풀이

  • map을 활용하여 각 문자에 대응하는 키보드 누르는 횟수를 저장한다.
  • for문을 돌면서 targets에 나오는 문자를 map에서 찾아서 횟수를 더한다.
  • 합이 0이면 만들 수 없는 문자열이므로 -1을 배열에 넣는다.
[오답 코드]
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;


class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        Map<Character, Integer> map = new HashMap<>();
        int[] answers = new int[targets.length];
            
        for(int i = 0; i < keymap.length; i++){
            String first = keymap[i];
            for(int j = 0; j < first.length(); j++){
                char c = first.charAt(j);
                if(map.containsKey(c)){
                    int inx = map.get(c);
                    map.put(c, Math.min(inx, j+1));
                }else{
                    map.put(c, j+1);
                }
            }
        }
        
        for(int i = 0; i < targets.length; i++){
            int answer = 0;
            String target = targets[i];
            for(int j = 0; j < target.length(); j++){
                char c = target.charAt(j);
                if(map.containsKey(c)){
                        answer += map.get(c);
                }
            }
            if(answer > 0){
                answers[i] = answer;
            } else if(answer == 0){
                answers[i] = -1;
            }
        }
        
        return answers;
    }
}
  • 위의 코드를 제출했더니 10개의 테스트에서 실패가 떴다.
  • 여러번 실행한 결과 만들지 못하는 문자와 만들 수 있는 문자가 섞여있을 때를 처리하는 것이 부족했다는 것을 알 수 있었다.
  • 만들지 못하는 문자가 나왔을 때 boolean변수와 break를 통해서 해당 문자열을 -1로 배열에 저장하게 했다.
[수정 코드]
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;


class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        Map<Character, Integer> map = new HashMap<>();
        int[] answers = new int[targets.length];
            
        for(int i = 0; i < keymap.length; i++){
            String first = keymap[i];
            for(int j = 0; j < first.length(); j++){
                char c = first.charAt(j);
                if(map.containsKey(c)){
                    int inx = map.get(c);
                    map.put(c, Math.min(inx, j+1));
                }else{
                    map.put(c, j+1);
                }
            }
        }
        
        for(int i = 0; i < targets.length; i++){
            int answer = 0;
            boolean noanswer = false;
            String target = targets[i];
            for(char c: target.toCharArray()){
                if(map.containsKey(c)){
                        answer += map.get(c);
                }else{
                    noanswer = true;
                    break;
                }
            }
            answers[i] = noanswer ? -1 : answer;
        }
        return answers;
    }
}

💡둘만의 암호 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 둘만의 암호

▼ 내 풀이

  • 먼저 skip하는 알파벳을 제외한 알파벳 리스트를 만든다.
  • 원래의 문자의 인덱스를 가져오고 index만큼 더한 수를 통해 알파벳 리스트에 접근한다.
  • 이때, 원하는 인덱스를 알파벳 리스트의 길이만큼 나누면 인덱스가 알파벳 리스트의 길이를 넘어도 안전하게 접근할 수 있다.
import java.util.List;
import java.util.ArrayList;

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        List<Character> alphabet = new ArrayList<>();
        
        //초기 알파벳 리스트 세팅
        for(char c = 'a'; c <= 'z'; c++){
            alphabet.add(c);
        }
        
        //skip 알파벳 삭제
        for(char c : skip.toCharArray()){
            int inx = alphabet.indexOf(c);
            alphabet.remove(inx);
        }
        int length = alphabet.size();
        
        //문자열 만들기
        for(char c : s.toCharArray()){
            int inx = alphabet.indexOf(c);
            inx += index;
            answer += String.valueOf(alphabet.get(inx%length));
        }
        return answer;
    }
}
profile
안녕하세요
post-custom-banner

0개의 댓글