Coding 공부/Java
[Java_Coding_Games] puzzle/ascii-art
CBJH
2024. 4. 22. 10:39
728x90
반응형
1. rule 설명
- ASCII art allows you to represent forms by using characters. To be precise, in our case, these forms are words. For example, the word "MANHATTAN" could be displayed as follows in ASCII art:
- Your mission is to write a program that can display a line of text in ASCII art in a style you are given as input.
- Write an answer using System.out.println() //답은 sysout으로 출력해 나타낸다.
- To debug: System.err.println("Debug messages...");
- 즉, 출력해야될 문자와 텍스트를 제공해주고, 그 데이터를 가공해서 별을 찍는 게임이다.
2. 사이트 주소
https://www.codingame.com/ide/puzzle/ascii-art
3. 코드
import java.util.*;
class Solution {
private static List<String> datas = new ArrayList<>();
private static List<String> datas_out = new ArrayList<>();
static void add_one_String(String T, int T_index, int L){
int index; //아스키코드값에 시작 문자열 아스키코드를 뺀 인덱스
int temp_index; //추가하는 문자열 1개의 아스키코드값
temp_index = (int)T.charAt(T_index);
if((int)'A'<= temp_index && temp_index <=(int)'Z'){
index = (int)T.charAt(T_index)-(int)'A';
}else if((int)'a'<= temp_index && temp_index <=(int)'z'){
index = (int)T.charAt(T_index)-(int)'a';
}else if(Character.toString(T.charAt(T_index)).equals("@")){
index = (int)'Z'-(int)'A'+1;
}else{
System.out.println("index error. temp_index: " + temp_index);
index = 0;
}
int index_start = index*L; //datas에 저장된 문자열의 시작 인덱스
int index_end = (index+1)*L; //datas에 저장된 문자열의 끝 인덱스
for (int i = 0; i < datas.size(); i++) {
String data = datas.get(i);
data = data.substring(index_start, index_end);
String temp_data = datas_out.get(i) + data;
datas_out.set(i, temp_data);
}
}
//datas_out에 있는 변환 완료된 데이터 출력
static void print_data(){
for(String data : datas_out){
System.out.println(data);
}
}
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int L = in.nextInt(); //char 가로 길이
int H = in.nextInt(); //char 세로 길이
if (in.hasNextLine()) {
in.nextLine();
}
String T = in.nextLine();
// System.out.println(T);//T가 무엇을 입력받는지 콘솔로 확인하는 코드
T = T.replaceAll(" ", "@"); //공백 @로 바꾸기
// System.out.println(T);//T가 무엇을 입력받는지 콘솔로 확인하는 코드
for (int i = 0; i < H; i++) {
String ROW = in.nextLine();
datas.add(i, ROW); //제공해주는 문자 datas 리스트에 담기
datas_out.add(i, ""); //datas_out 리스트 초기화
}
//(int)'A' = 65(아스키코드) (int)'a' = 97
for(int i=0; i<T.length(); i++){ //datas_out에 출력할 문자열 길이만큼 반복
add_one_String(T,i,L); //문자열 하나씩 datas_out 리스트에 담기
}
print_data();
}
}
4. 코드 설명 + @
- @가 입력 받을 경우 아스키코드 값을 사용하는 것이 아니라 Z 다음 인덱스를 사용해야 되는 부분을 적용할때 어디에 if문을 넣어야 할지, 어느 인덱스를 수정해야될지 헷갈렸다.
- 주석과 변수명을 명확히 해야되는 중요성을 깨닫게 되었다.(내가 짠 코드인데 하루만에 작성한게 아니다보니 볼때마다 새로워 헷갈렸다.)
- 입력받는 'ROW' 문자열을 어떻게 저장할까 생각하다가 ArrayList을 많이 써봐서 채용했다.
- 마지막 문제에서 공백제거 또는 공백을 @로 바꾸는 것을 적용하기 위해 오랜만에 String 메소드를 검색해서 찾아봤다. replaceAll메서드로 쉽게 바꿀수 있어 편했다.