코딩테스트/프로그래머스

[프로그래머스 Lv.1] JAVA 문자열, 수 3

머밍 2024. 7. 2. 16:03

시저 암호

아스키 코드값을 직접 입력해서 구하지 않고 구현했다.
n만큼 시프트 했을때 z나 Z를 넘어가면 a와 A부터 시작하는 부분이 어려웠다. 둘다 현재 값에서 26을 빼면 다시 a나 A로 돌아갈 수 있는 점을 이용하였다.

class Solution {
    public String solution(String s, int n) {
        String answer = "";

        for(int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if( ch == ' '){
                answer += ch;
                continue;

            }

            if(Character.isLowerCase(ch)){
                //알파벳 소문자 범위를 넘어가면 다시 a로 돌아가기 위해 26빼기
                if(ch + n > 'z'){
                    answer += (char) (ch - 26 + n);
                } else{
                    answer += (char) (ch + n);
                }
            } else{
                if(ch + n > 'Z'){
                    answer += (char) (ch - 26 + n);
                } else{
                    answer += (char) (ch + n);
                }
            }
        }
        return answer;
    }
}

가장 가까운 같은 글자

현재 문자인 i의 이전 인덱스들을 검사하는 이중for문으로 구현했다.

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        answer[0] = -1;
        
        for(int i = 1; i < s.length(); i++){
            for(int j = i-1; j >=0; j--){
                if(s.charAt(i) == s.charAt(j)){
                    answer[i] = i - j;
                    break;
                } 
            }
            //같은 문자가 없을때
            if(answer[i]==0) {
                answer[i] = -1;
            }
        }
            
        return answer;
    }
}

 

  • Map으로 구현
    문자와 문자에 따른 인덱스를 한번에 저장할 수 있기에 구현해봤다
Map: key-value 쌍을 저장하는 자료구조
-> 특징: 데이터를 key와 value의 쌍으로 저장,각 key는 유일해야 하며, value는 key와 관련된 데이터

HashMap
-> 특징: key나 value로 null을 허용, 삽입 순서를 보장 안함
메서드
1 .put(key, value): key-value 쌍을 추가하거나 기존 key에 대한 value를 업데이트
2.get(key): 주어진 key에 대응하는 value를 반환
3. containsKey(key): 주어진 key가 Map에 존재하는지 여부를 반환

 

import java.util.Map;
import java.util.HashMap;

class Solution {
    public int[] solution(String s) {
       
        int[] answer = new int[s.length()];
        // s의 문자와 index를 담을 map 선언(키-쌍)
        Map<Character, Integer> map = new HashMap<>();

        // s의 길이만큼 반복
        for (int i = 0; i < s.length(); i++) {
            // 현재 문자가 처음 등장함
            if (!map.containsKey(s.charAt(i))) {
                answer[i] = -1;
                //현재 문자 위치 map에 저장
                map.put(s.charAt(i), i);
            } else {
                // 해당 문자가 map에 이미 존재
                answer[i] = i - map.get(s.charAt(i));
                map.put(s.charAt(i), i);
            }
        }

        return answer;
    }
}

숫자 문자열과 영단어

인덱스로 접근해서 구해야지라고 생각해서 포함하면 바꾸자까지는 갔는데 구체적으로 저 인덱스 i를 문자열로 대체하는 건 생각하지 못해 구글링의 도움을 받았다.
arr 배열 적을때 0부터 아무생각없이 zero부터 적었는데 앞으로는 생각을 좀 더 해야겠다.

class Solution {
    public int solution(String s) {
        String[] arr = {"zero","one","two","three","four","five","six","seven","eight","nine"};

        for(int i=0;i<arr.length;i++){
            if(s.contains(arr[i])){
                s= s.replace(arr[i],Integer.toString(i));
            }
        }
        int answer = 0;
        return Integer.parseInt(s);
    }
}

두 개 뽑아서 더하기