본문 바로가기
Problem Solving/BOJ

백준-2999번 비밀이메일

by 채니_ 2021. 2. 13.

www.acmicpc.net/problem/2999

 

2999번: 비밀 이메일

정인이는 원래 "bombonisuuladici"를 보내려고 했다. 이 메시지는 16글자이므로, 정인이는 1*16, 2*8, 4*4 행렬을 선택할 수 있다. R이 가장 큰 것은 4*4이므로, 4*4를 선택한다. 정인이가 만든 행렬은 다음과

www.acmicpc.net


R과C를 재귀함수를 사용하여 골랐다

유도파트: 길이/k ==0이고 k<=length/2인경우 R, C업데이트

재귀

기저조건: k>C인경우 return. 

 

이렇게 하면 자동으로 제일 큰 R이 R값이 된다.


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.Scanner;

public class 비밀이메일 {
	static char[] jongin;
	static char[][] get;
	static int R,C;
	public static void main(String[] args) throws FileNotFoundException {
		System.setIn(new FileInputStream("input/비밀이메일.txt"));
		Scanner sc = new Scanner(System.in);
		StringBuilder sb = new StringBuilder();
		String str = sc.next();//정인이가 보낸 암호화된문자열
		jongin = str.toCharArray();//문자형 배열에 저장
		
		R=100;//행
		C=100;//열
		select(1,str.length());//1부터시작하며 암호문의길이전달, R과 C구하기
		get = new char[R][C];
		int cnt=0;
		for (int j = 0; j < C; j++) {//정인이가 보낸 암호를 R과 C에맞추어서 행우선으로 배열에저장
			for (int i = 0; i < R; i++) {
				get[i][j] = jongin[cnt];
				cnt++;
			}
		}
		for (int i = 0; i < R; i++) {//상근이가 열 우선으로 읽기
			for (int j = 0; j < C; j++) {
				sb.append(get[i][j]);
			}
		}
		System.out.println(sb);

	}
	private static void select(int k, int length) {
		if(k > C) {//K가 길이의 반보다 커지면 종료
//			System.out.println(R+" "+C);
			return;
		}
		if(length%k==0 && k <=length/k) {//만약 길이가 k로 나누어지고 R<=C인경우 R과 C업데이트
			R = k;
			C= length/k;
		}
		select(k+1,length);//k+1을하며 계속 검사
	}

}

'Problem Solving > BOJ' 카테고리의 다른 글

백준-1012 유기농 배추  (0) 2021.02.14
백준-2667 단지번호붙이기  (0) 2021.02.14
백준- 3985번 롤케이크  (0) 2021.02.13
백준- 2941 크로아티아 알파벳  (0) 2021.02.13
백준- 1158 요세푸스 문제  (0) 2021.02.09

댓글