반응형
👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇
암호
문제해결 고민
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));
}
}
반응형
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Aʟɢᴏʀɪᴛʜᴍ' 카테고리의 다른 글
Algorithm - 문자열 압축 (0) | 2023.11.01 |
---|---|
Algorithm - 문자 거리 (1) | 2023.11.01 |
Algorithm - 숫자만 추출 (1) | 2023.10.20 |
Algorithm - 유효한 팰린드룸 (0) | 2023.10.18 |
Algorithm - 회문 문자열 (0) | 2023.10.18 |