[프로그래머스] 둘만의 암호 자바코드

mango·2023년 3월 25일
0

* Things I learnt

1. string에서 한문자 변경

(참고사이트: https://developer-talk.tistory.com/690)

5번째 자리 '-'로 바꾸기
str = str.substring(0, 5) + '-' + str.substring(5+1);

2. 아스키코드

(참고사이트: https://blog.naver.com/PostView.nhn?blogId=jysaa5&logNo=221831226674)

(char)97 = a
(int)a = 97

a~z : 97~122
A~Z : 65~90

3. 날짜 연도, 월, 일 계산은 if문이 아닌 while문으로

범위를 벗어나면 일 -30 혹은 월 -12 이렇게 해줘야 하는 경우,
if 문이 아니라 while문으로 범위 안에 들어오게 해주기!

* 알고리즘

  1. skip의 알파벳을 다 뺀 새로운 알파벳 나열 alpha 를 만들어줄 것임
  2. HashMap으로 인덱스와 알파벳 둘다 검색할 수 있도록 2개 각각 만들어줌
  3. s를 훑으면서 인덱스 찾고, index 더해준 뒤 newAlpha 가 alpha 길이 안에 들어올 때까지 반복문 돌려주며 뺌
  4. 변환된 캐릭터를 answer에 더해줌

* 자바코드

- (1차시도)

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        HashMap<Character, Integer> hm = new HashMap<Character, Integer> ();
        
        for(int i = 0; i < skip.length(); i++){
            hm.put(skip.charAt(i), 1);
        }
       int p;
        for(int i = 0; i < s.length(); i++){
            p = 0;
            for(int j = 0; j < index; j++){
                p++;
                if(s.charAt(i) + p > 122)
                   p -= 26;
                if(hm.get((char)(s.charAt(i) + p)) == null)
                    continue;
                else 
                    p++;
            }
            s = s.substring(0, i) + (char)(s.charAt(i) + p) + s.substring(i + 1);
        }
        
         answer = s;
        
        return answer;
    }
}

악 틀렸다..

string은 아직 갈 길이 먼듯... 모르는것도 많고 인터넷의 도움 없이는 문법을 모르는 상태다.
여러번의 문제풀이를 통해 함수랑 문법 익히기

- (2차 시도)

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        
        HashMap<Character, Integer> skipHm = new HashMap <Character, Integer>();
        HashMap<Character, Integer> alpha = new HashMap<Character, Integer>();
        HashMap<Integer, Character> number = new HashMap<Integer, Character>();
        
        for(int i = 0; i < skip.length(); i++){
            skipHm.put(skip.charAt(i), 1);
        }        

        int j = 1;
        for(int i = 97; i < 123; i++){
            if(skipHm.containsKey((char)i) == false){
                alpha.put((char)i, j);
                number.put(j, (char)i);
                j++;
            }   
        }

        int newAlpha = 0;
        for(int i = 0; i < s.length(); i++){
            newAlpha = alpha.get(s.charAt(i)) + index;
            
            if(newAlpha > alpha.size())
                newAlpha -= alpha.size();
            
            answer+= number.get(newAlpha);
        }
        
        return answer;
    }
}

-> 이렇게 몇개만 틀렸다는 건 알고리즘은 맞으나 작은 실수가 있었다는 것

- (3차 시도)

import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        
        HashMap<Character, Integer> skipHm = new HashMap <Character, Integer>();
        HashMap<Character, Integer> alpha = new HashMap<Character, Integer>();
        HashMap<Integer, Character> number = new HashMap<Integer, Character>();
        
        for(int i = 0; i < skip.length(); i++){
            skipHm.put(skip.charAt(i), 1);
        }        

		//skip을 뺀 새로운 alpha, number 나열을 만들어줌
        int j = 1;
        for(int i = 97; i < 123; i++){
            if(skipHm.containsKey((char)i) == false){
                alpha.put((char)i, j);
                number.put(j, (char)i);
                j++;
            }   
        }
        
		//s 를 읽으면서 alpha와 number 해쉬맵을 이용하여 index만큼 더해주고 크기만큼 빼주기
        int newAlpha = 0;
        for(int i = 0; i < s.length(); i++){
            newAlpha = alpha.get(s.charAt(i)) + index;
            
            //if문이 아니라 while문으로 두번빼야 하는 경우를 해결함
            while(newAlpha > alpha.size()){
                newAlpha -= alpha.size();
            }
            answer+= number.get(newAlpha);
        }
        
        return answer;
    }
}

-> 저번에 비슷한 실수 때문에 똑같이 틀렸던 적 있는데,
새로만든 alpha 길이가 만약 10인데, newAlpha는 23인거다. 그러면 alpha 길이를 한번만 빼주는게 아니라 두번 빼줘야 함
<그래서, if문이 아닌 while문으로 alpha 길이 안에 들어오게 맞춰줘야 한다.>

profile
앎의 즐거움을 아는 나는 mango ♪

0개의 댓글