Home B2999. 비밀 이메일
Post
Cancel

B2999. 비밀 이메일

문제

image

제출 코드

image

  • 무려 5번의 시도 끝에 성공한 문제
  • 처음에 런타임에러를 시간초과로 잘못봐서, 3회 제출까지는 최적화만 신경씀
    • StringBuilder사용, tokenizer 시도 등
    • split 사용하지 않고 tokenizer 써서 공백없이 한글자씩 떼오는거 찾아보기. 전에 수업시간에 배움.
  • 두가지 예외사항을 고려하지 않아 두번 에러가 났다

    1. [0][0]에서의 / by zero 런타임에러

      → 0,0은 행열 변환해도 바뀌지 않으니 연산없이 넣어줌

    2. 입력받는 문자열의 길이가 소수인 경우 : ArrayIndexOutOfBounds 런타임 에러

      → col과 row 값이 0으로 계산되어 행렬생성 과정에서 문제 생김

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package bronze;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B2999_secretEmail {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String line = br.readLine();
		StringBuilder sb = new StringBuilder();

		int row=0, col=0, diff=Integer.MAX_VALUE;
		int len  = line.length();

		// 행 & 열 값 구하기 (암호화 전의 행과 열)
		int count=0;
		for(int i=len-1; i>0; i--) {
			if(len%i == 0) {
				int tmp_c = i;
				int tmp_r = len / i;
				if (tmp_c < tmp_r) {
					break;
				}else if (tmp_c-tmp_r < diff) {
					diff = tmp_c-tmp_r;
					col = tmp_c;
					row = tmp_r;
				}
			}
		}

		// case1. 문지열 길이가 소수인 경우
		if(row==0) {
			System.out.println(line);
			return;
		}

		// case2. 문자열 길이가 합성수인 경우 - 암호화 전 행렬채우기
		char[][] arr = new char[row][col];
		arr[0][0] = line.charAt(0);
		for(int i=1; i<len; i++) {
			arr[i%row][i/row] = line.charAt(i);
		}

		for(int i=0; i<row; i++) {
			for(int j=0; j<col; j++) {
				sb.append(arr[i][j]);
			}
		}
		System.out.println(sb);
	}

}
This post is licensed under CC BY 4.0 by the author.