유리쯔의일상 2023. 11. 7. 23:16
반응형

 

 

 

 

👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇

 

 

 

암호

 

 

 


 

 

문제해결 고민

2진수에서 10진수로 변환하는 계산법 재차 확인
1. 길이 7 칸의 빈 배열 하나 , 길이 4칸의 빈배열하나 생성한다 
2. 입력받은 특수문자를 뒤에서부터 char자로형으로 가져온다
\# 은 숫자 1
\* 은 숫자 0
1. 변환시킨 뒤 7개를 변환하고난뒤 배열에 7개가 다 들어가면
2. 2진수를 10진수로 바로 바꿔준다 사이즈 4칸짜리의 배열에 10진수로 바뀐 값을 넣어준다
3. 다시 2번으로 되돌아가서 이미 읽어온 7개 다음 문자를 가져오고, 반복한다
4. 출력할때엔 2진 수로 된 걸 캐스팅하여 출력해 준다

 

이렇게 생각하면서 짜보기 시작했다

이 짧은 지식이 큰 파장을 불러올 건 상상도 못 했다

 


 

 

1차 도전 - 실패

import java.util.ArrayList;  
import java.util.Scanner;  
  
public class Main {  
    static ArrayList<String> asiiTmpList = null;  
    public void solution(int t , String str) {  
        asiiTmpList = new ArrayList<>(t);  
        char[] tmpChar = str.toCharArray();  
        String tmp="";  
        // String 배열 자료 나누기  
        for (int i = tmpChar.length-1 , v = 0; i >= 0; i--, v++) {  
            char iTmp = tmpChar[i];  
            if (iTmp == '#') iTmp = 49;  
            if (iTmp == '*') iTmp = 48;  
            if (v < 7 ){  
                tmp += iTmp;  
            } else {  
                v = 0;  
                asiiTmpList.add(tmp);  
                tmp = "";  
                tmp += iTmp;  
            }  
            if ( i == 0 ) asiiTmpList.add(tmp);  
        }  
        asciiCodeReturn(asiiTmpList);  
    }  
  
    public static void asciiCodeReturn(ArrayList<String> asciiMapping) {  
        ArrayList<Integer> mapping = new ArrayList<>();  
        int number = 1;  
        int number1 = 0;  
        for (int i = 0; i < asciiMapping.size(); i++) {  
            for (int j = 0; j < asciiMapping.get(i).length(); j++) {  
                char tmp = asciiMapping.get(i).charAt(j);  
                if (tmp == 49) {  
                    for (int k = 0; k < j; k++) number *= 2;  
                    number1 += number;  
                    number = 1;  
                }  
            }  
            mapping.add(number1);  
            number1 = 0;  
        }  
        asciiCodePrt(mapping);  
    }  
  
    public static void asciiCodePrt(ArrayList<Integer> mapping) {  
        for (int i = mapping.size() - 1; i >= 0; i--) {  
            int tmp = mapping.get(i);  
            System.out.print((char) tmp);  
        }  
    }  
  
    public static void main(String[] args) {  
        Main T = new Main();  
        Scanner in = new Scanner(System.in);  
        int t = in.nextInt();  
        in.nextLine();  
        String str = in.nextLine();  
        if ( str.length() % t == 0 ) T.solution(t, str);  
    }  
}

 

테스트했을 때 잘 되었다.

다만 제출했을 때 오답이었다.

그리고 내가 봐도 비효율 적인 코드 같았다.

다시 생각해 봐야겠다

 

 

 

 

 

2차 도전 - 실패

package Chapter_List;  
  
import java.util.Scanner;  
  
public class chapter_12 {  
    public int[] solution(String speStr, int size){  
        int[] castingArray = new int[size];  
        int[] change = new int[7];  
        int result = 0;  
        int tmpNum = 1;  
        int castpoint = 0;  
        for (int i = speStr.length()-1, v = 0; i >= 0 ; i--, v++) {  
            char iTmp = speStr.charAt(i);  
            if (iTmp == '#') change[v] = 1;  
            else change[v] = 0;  
            if (v == 6) {  
                v = -1;  
                for (int j = 0; j < change.length; j++) {  
                    if (change[j] == 1) {  
                        for (int k = 0; k < j; k++) {  
                            tmpNum *= 2;  
                        }  
                        result += tmpNum;  
                        tmpNum = 1;  
                    }  
                }  
                castingArray[castpoint] = result;  
                result = 0;  
                castpoint++;  
                change = new int[7];  
            }  
        }  
        return castingArray;  
    }  
    public static void main(String[] args) {  
        chapter_12 T = new chapter_12();  
        Scanner in = new Scanner(System.in);  
        int indexNum = in.nextInt();  
        in.nextLine();  
        String speStr = in.nextLine();  
        int[] castingNumber = T.solution(speStr, indexNum);  
        for (int i = castingNumber.length-1; i >= 0; i--) {  
            System.out.print((char)castingNumber[i]);  
        }  
    }  
}

 

똑같이 인텔리제이에선 잘 돼서 제출했더니 오답이란다.

아니 왜!? 난 잘되는데!!

 

 


 

 

3번째 도전 - 실패

 

import java.util.Scanner;

public class Main {
	public String solution(String speStr, int size){
        int[] castingArray = new int[size];
        int[] change = new int[7];
        int result = 0;
        int tmpNum = 1;
        int castpoint = 0;
        for (int i = speStr.length()-1, v = 0; i >= 0 ; i--, v++) {
            char iTmp = speStr.charAt(i);
            if (iTmp == '#') change[v] = 1;
            else change[v] = 0;
            if (v == 6) {
                v = -1;
                for (int j = 0; j < change.length; j++) {
                    if (change[j] == 1) {
                        for (int k = 0; k < j; k++) {
                            tmpNum *= 2;
                        }
                        result += tmpNum;
                        tmpNum = 1;
                    }
                }
                castingArray[castpoint] = result;
                result = 0;
                castpoint++;
                change = new int[7];
            }
        }
        String answer = "";
        for (int i = castingArray.length-1; i >= 0; i--) {
            answer+= (char)castingArray[i];
        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int indexNum = in.nextInt();
        in.nextLine();
        String speStr = in.nextLine();
        System.out.println(T.solution(speStr, indexNum));
    }
}

 

흑흑 눈물이 앞을 가렸다.

결국엔 선생님의 풀이를 봤다

 

 

 


 

 

 

 

쌤의 풀이

포인트는 subString을 사용하고 replace,  그리고 Integer.parseInt 메서드 사용이었다

Integer.parseInt 메서드는 내가 정말 너무 얕게 알고 있다는 걸 뼈저리게 느꼈다ㅠ

Integer.parseInt 메서드에 String 문자열을 넣고 2라고 하면 아스키코드번호로 바꿔주다니. 너무 충격..

더 공부해야겠다

 

package Chapter_List;  
  
import java.util.Scanner;  
  
public class chapter_12 {  
    public String solution(String speStr, int size){  
        String answer = "";  
        for (int i = 0; i < size; i++) {  
            String tmp = speStr.substring(0,7).replace('#', '1').replace('*', '0');  
            int num=Integer.parseInt(tmp, 2);  
            // Integer.parseInt(tmp, 2) 하면 2진수를 아스키코드 번호로 바꿔준다....  
            answer+=(char)num;  
            speStr = speStr.substring(7);  
        }  
        return answer;  
    }  
    public static void main(String[] args) {  
        chapter_12 T = new chapter_12();  
        Scanner in = new Scanner(System.in);  
        int indexNum = in.nextInt();  
        in.nextLine();  
        String speStr = in.nextLine();  
        System.out.println(T.solution(speStr, indexNum));  
    }  
}
반응형