암호 (문자열 활용)

Seungmin Lim·2022년 2월 5일
0

코딩문제연습

목록 보기
12/63

문제

나의풀이

import java.util.*;

class Main {
		    public String solution(int n,String s) {
		    	String answer = "";
		    	String[] arr = new String[n];
		    	for(int i=0; i<s.length();i++) {
		    		if(i==0) {
		    			arr[0] = s.substring(0, 7);
		    		}
		    		else if(i%7 == 0) {
		    			arr[i/7] = s.substring(i, i+7);
		    		}
		    	}
		    	
		    	for(int i = 0; i<arr.length;i++) {
		    		arr[i] = arr[i].replaceAll("[#]", "1");
		    		arr[i] = arr[i].replaceAll("[*]", "0");
		    	}
		    	for(String x : arr) {
			    	char a = (char) Integer.parseInt(x, 2);
			    	x = Character.toString(a);
			    	answer += x;
		    	}
		    	return answer;
		    }
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		String str = kb.next();
		System.out.println(T.solution(n,str));
	}
	
}

효율적인풀이

import java.util.*;

class Main {
		    public String solution(int n,String s) {
		    	String answer = "";
		    	for(int i=0; i<n;i++) {
		    		String tmp = s.substring(0,7).replace('#', '1').replace('*','0');
		    		int num = Integer.parseInt(tmp,2);
		    		answer += (char) num;
		    		s = s.substring(7);
		    	}
		    	return answer;
		    }
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		String str = kb.next();
		System.out.println(T.solution(n,str));
	}
	
}

풀이방법

내 풀이방법이 틀린건 아니지만 코드 양이 많고, 조잡하다..
효율적인 풀이법과 내 풀이의 차이점을 보자면,
1. for문을 n회만큼 돌린다. 그리고 전체 스트링을 놓고 보는게 아닌, substring후에는 필요없는 부분은 제외하고 처리한다. (배웠는데 ㅠㅠ)
2. 여러for문을 만들지않고 최대한 한개의 for문 안에서 처리한다.
String tmp = s.substring(0,7) 자체에서 replace를 통해
'#' -> '1', '*' -> '0'으로 바꾼다.

핵심키워드

  • substring(0,7)로 끊고, 다음 s를 s.substring(7)로 하면 이미 끊긴 string을 제외한 부분을 지정해서 돌릴수있다.
  • Integer.parseInt(n,진수); 를 이용하면 2진수,8진수 16진수 등 여러 진수 형태의 값을 10진수 값으로 나타낼수있다.
  • 효율적인 코드를 쓰자!

0개의 댓글