-
220305_JAVA_문제 풀어보기1. JAVA/1.3 문제 2022. 3. 5. 19:30
'A' - 'J' 까지의 문자를 랜덤하게 100 만들고
각문자의 출현횟수를 기억할 배열을 만들어서
회수만큼 '*' 로 출력해주는 프로그램을 작성하세요.
예 ]
A [5] : *****
B [20] : *******************
..
J [7] : *******처음에 이 문제를 풀때 'A' - 'J'까지 100개의 랜덤한 배열이라는 말에만 초점을 맞추어서 100개의 배열을 형성해준 후 오름차순 정렬하여 해당 숫자만큼 count 변수를 생성하여 만들려고 하였다... 계속 삽질하다가 결국 문제 못품..ㅋㅋㅋ
답을 확인해보니 'A' to 'J' 까지 넣어줄 10개의 배열을 만든다 -> 'A' to 'J' 까지 100개가 나오도록 반복문으로 만들어서 문제를 푸는것이었다.. 바보..ㅋㅋ
두가지 방법으로 풀어보기로 하였다.
1. 일반 배열로 풀어보기
1.1 A to J까지 넣어줄 배열 만들기
int [] array = new int[10];
1.2 A to J 사이의 100개의 랜덤한 문자 생성
for( int i = 0; i<100; i++){
char ch = (char)(Math.random()*('J'-'A'+1)+'A';
1.2.1 Math.random()*(범위)+시작점;
ex1) 1부터 10까지라고 한다면 (int)(Math.random()*(10-1+1)+1)으로 해주면 된다.
ex2) 3부터 10까지라고 한다면 (int)(Math.random()*(10-3+1)+3)으로 해주면 된다.
1.2.2 인덱스값 생성
int index = (ch-'A);
ex) 1.2 에서 랜덤하게 형성된 문자가 C였다고 하면, C에 대한 값이 ch의 변수에 입력이 될것이고
맨 첫번째로 시작되는것이 'A'이므로 'A'를 빼주게 되면 C의 인덱스 값은 2가 된다.
1.2.3 배열에 넣어주기
array[index] +=1;
ex1 ) 1.2에서 랜덤하게 형성된 첫번째 문자가 'A' 라고 한다면index의 값은 'A' : 'A'-'A' = 0
array 배열에 구체적인 값을 넣어주지 않아 0으로 초기화 되어있는 상황이므로
array[0] = array[0]+1 이 되어 array[0] = 1 이 되고
두번째 문자가 'B'라고 한다면
index의 값은 'B' : 'B'-'A' = 1
array[1] = array[1]+1 이 되어 array[1] = 1 이 된다.
세번째 문자가 'A'일때,
이때도 똑같이 array[0] = 1이었는데 array[0] = array[0] (<- 1) + 1로 1을 누적시켜준다..
해당 작업을 100번 반복하면 문자의 갯수가 해당 인덱스에 누적해서 더해질 것이다.
1.3 출력
String str = "";
1.3.1 별을 출력된 갯수만큼 누적해서 담아줄 String 변수
for(int i = 0; i<array.length;i++){
char ch = 'A'+i;
1.3.1 array[]는 A에서 J까지의 랜덤하게 형성된 문자 갯수이다. 그러므로 A부터 J까지의 문자를 출력하기
위하여 for문 안에 char 타입의 지역변수 ch를 만들었다.
System.out.print( ch+" [+array[i]+"] : ");
1.3.2 별 만들어지기 전까지 출력문 작성
int starNum = array[i];
1.3.3 별의 갯수를 출력하기 위하여 중첩으로 for문을 작성해줘야 하는데 범위는 array[i]까지 이다.
굳이 변수 생성 안해도 될거같긴한데.. 그냥 넣어줬다..
for(int j = 0; i<starNum;j++){ str += "*";}
(사실 해당 작업은 굳이.. 안해도 될거같고.. 그냥 System.out.print("*")만 해줘도 결과는 동일하게 나온다..
1.3.4 "*"은 array[i](랜덤하게 생성된 알파벳 갯수)만큼 누적되어서 계속 추가된다.
System.out.print(str);
str = "";
1.3.5 해당 작업을 해주지 않으면 array[i]가 계속 누적되서 별이 출력되므로 꼭 넣어줘야한다.
System.out.println();
}
2. 2차원 배열로 풀어보기
int[][] array = new int['J'-'A'+1][2];(=new int [10][2]라고 해도 된다..ㅋㅋㅋ)
array[][0] ==> 문자를 넣을 공간
array[][1] ==> 랜덤하게 100개의 문자를 생성시켜 주었을때 문자 갯수
2.1 첫번째 칸에 문자 삽입하는 행위
for(int i = 0; i<array.length;i++){
array[i][0] = (char)(i+'A'); 배열이 int 배열이므로 char 타입으로 강제 형변환.
==> array[0][0]~array[9][0] A부터~J까지 넣어주는 행위
예를 들어 array[0][0] = 'A'+0 이기 때문에 'A'가 들어가게 된다.
array[1][0] = 'A'+1 이기 때문에 'B'가 들어가게 된다.
}
2.2 두번째 칸에 랜덤하게 100개의 A to J가 들어가는 문자를 카운트하는 행위.
for(int i = 0; i<100;i++){
char ch = (char)(Math.random()*('J'-'A'+1)+'A);
2.2.1 A~J 까지 랜덤하게 문자 생성
int index = ch-'A';
2.2.2) A to J 까지 인덱스열 생성
예를 들어 랜덤하게 뽑은 첫번째 문자 ch가 A이면 인덱스는 0이다.
그러므로 가장 첫번째 숫자인 A에 A를 빼주면 0이 된다.
B 이면 index는 'B'-'A' : 1이 된다.
array[index][1] +=1;
2.2.3) 위에서 언급했듯이 array[][1]은 랜덤하게 생성된 문자열의 갯수를 넣을 예정이므로
2.2.2)에서 생성한 index를 배열 인덱스에 넣어주었다.
이렇게 되면 만약 첫번째 'A'를 뽑고 그 다음번에도 'A'를 뽑으면 array[0][1]에 1씩 더해지게 된다.
2.3 출력
for(int i = 0; i<array.length;i++){
System.out.print((char)array[i][0]+"["+array[i][1]+"] : ")
2.3.1) array[i][0] : 'A'~'J'에 대한 문자가 출력
array[i][1] : 'A'~'J'가 랜덤하게 출력된 횟수
for(int j = 0; j<array[i][1].length;j++){
2.3.2) array[i].length : 'A'~'J'가 랜덤하게 출력된 횟수만큼 범위 설정하여 "*"가 출력되도록 하기위함
System.out.print("*");
}
System.out.println();
콘솔화면
'1. JAVA > 1.3 문제' 카테고리의 다른 글
220419_JAVA_문제풀어보기(정보 입력프로그램) (0) 2022.04.19 220418_JAVA_문제풀어보기 (0) 2022.04.18 22041_JAVA_문제풀어보기(자판기프로그램2) (0) 2022.04.10 220403_JAVA_문제풀어보기(자판기프로그램1) (0) 2022.04.03 220314_JAVA_문제 풀어보기 (0) 2022.03.14