[7번]
1. 문제설명
제어구조 중첩 + 다차원 배열 + 배열 문제
// 1. res/map.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
00010
01010
00000
// 2. map이라는 이름으로 5x3 크기의 정수를 담을 수 있는 이차원 배열과 board라는 이름의 10X6크기의 문자를 담을 수 있는 이차원 배열을 생성하시오.
[ ] map = [ ];
[ ] board = [ ];
// 3. res/map.txt에서 읽은 데이터로 map 배열을 채우시오.
{
// 코드를 작성하는 공간
System.out.println(“map 데이터 로드 완료”);
}
// 4. map 데이터 하나는 board 배열의 4칸과 대응되며 다음과 같은 모양으로 대응된다.
// map에서 0은 다음 모양과 같다.
// ┌ ┐
// └ ┘
// map에서 1은 다음 모양과 같다.
// ▩▩
// ▩▩
// map에서 읽은 데이터를 이용해서 board 배열을 채우시오. 다음은 board 배열에 채워진
// 모습니다.
// ┌ ┐┌ ┐┌ ┐▩▩┌ ┐
// └ ┘└ ┘└ ┘▩▩└ ┘
// ┌ ┐▩▩┌ ┐▩▩┌ ┐
// └ ┘▩▩└ ┘▩▩└ ┘
// ┌ ┐┌ ┐┌ ┐┌ ┐┌ ┐
// └ ┘└ ┘└ ┘└ ┘└ ┘
{
// 코드를 작성하는 공간
System.out.println(“board 그리기 완료”);
}
// 5. board 배열을 화면에 출력하는 코드를 작성하시오.
{
// 코드를 작성하는 공간
System.out.println(“board 출력 완료”);
}
2. 나의 해답
package T221216;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class test7 {
static void print_Array (int [][] map) {
for(int j = 0 ; j < map.length; j++) {
for(int i = 0 ; i< map[j].length ; i++)
System.out.print(map[j][i]);
System.out.println();
}}
static void print_Array_c (char [][] map) {
for(int j = 0 ; j < map.length; j++) {
for(int i = 0 ; i< map[j].length ; i++)
System.out.print(map[j][i]);
System.out.println();
}}
public static void main(String[] args) throws IOException {
// 1. res/map.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
//00010
//01010
//00000
// 2. map이라는 이름으로 5x3 크기의 정수를 담을 수 있는 이차원 배열과
// board라는 이름의 10X6크기의 문자를 담을 수 있는 이차원 배열을 생성하시오.
int [][] map = new int [3][5];
char [][] board = new char [6][10];
// 3. res/map.txt에서 읽은 데이터로 map 배열을 채우시오.
{
// 코드를 작성하는 공간
FileInputStream fis = new FileInputStream("res/map.txt");
Scanner scan = new Scanner(fis);
for(int j = 0 ; j < map.length; j++) {
String mapLine= scan.nextLine();
for(int i = 0 ; i< map[j].length ; i++) {
String[] temp = mapLine.split("");
map[j][i] = Integer.parseInt(temp[i]);
}
}
System.out.println("map 데이터 로드 완료");
print_Array(map);
scan.close();
fis.close();
}
{
char [][] W_stone = new char [2][2];
char [][] B_stone = new char [2][2];
// 돌 커스터마이징
//0 일때
W_stone[0][0] = '┌';
W_stone[0][1] = '┐';
W_stone[1][0] = '└';
W_stone[1][1] = '┘';
//1 일때
B_stone[0][0] = '▩';
B_stone[0][1] = '▩';
B_stone[1][0] = '▩';
B_stone[1][1] = '▩';
print_Array_c(W_stone);
print_Array_c(B_stone);
System.out.println("흑돌,백돌 완료");
for(int j = 0 ; j < map.length ; j++) {
for(int i = 0 ; i< map[j].length ; i++)
if( map[j][i] == 1) {
board[j*2][i * 2] = 'B';
}
else {
board[j*2][i * 2] = 'W';
}
}
System.out.println("위치 이식완료");
print_Array_c(board);
for(int j = 0; j < map.length; j++)
for(int i = 0 ; i < map[j].length ; i++) {
if(board[j*2][i*2] == 'W') {
board[j *2][i *2] = W_stone[0][0];
board[j *2][i *2 +1] = W_stone[0][1];
board[j *2 +1][i *2] = W_stone[1][0];
board[j *2 +1][i *2+1] = W_stone[1][1];
}
else if(board[j*2][i*2] == 'B') {
board[j *2][i *2] = B_stone[0][0];
board[j *2][i *2 +1] = B_stone[0][1];
board[j *2 +1][i *2] = B_stone[1][0];
board[j *2 +1][i *2+1] = B_stone[1][1];
}
}
System.out.println("돌 이식 여부");
print_Array_c(board);
System.out.println("board 그리기 완료");
}
// 5. board 배열을 화면에 출력하는 코드를 작성하시오.
{
print_Array_c(board);
System.out.println("board 출력 완료");
}
}
}
콘솔
map 데이터 로드 완료
00010
01010
00000
┌┐
└┘
▩▩
▩▩
흑백돌 완료
위치 이식완료
W
3. 정답 코드 (대안 코드)
{
for(int j = 0; j < map.length; j++)
for(int i = 0 ; i < map[j].length ; i++) {
if(map[j][i] == 0) {
board[j *2][i *2] = '┌';
board[j *2][i *2 +1] = '┐';
board[j *2 +1][i *2] = '└';
board[j *2 +1][i *2+1] = '┘';
}
else if(map[j][i] == 1) {
board[j *2][i *2] = '▩';
board[j *2][i *2 +1] = '▩';
board[j *2 +1][i *2] = '▩';
board[j *2 +1][i *2+1] = '▩';
}
}
}
50 줄을 15줄로 줄일 수 있는 방식이다.
이 부분에 대해서 단계별로 할지, 다음과 같이 15줄로 한번에 할지 무엇이 과연 바람직할까?
수정가능성 관점에서 과연? > 함수화 관점에서는 바람직할 수있다.
다만 코테 알고리즘 관점에서는 다소 아닐수도...
4. 보충 및 회고
(1) 보충
1) 배열값 바로 이용하기보다, 일반 변수를 한번 거쳐서 이용하기!
2) 문자를 정수로 바꾸는 것은 번역기를 이용해서 (ex: 'A' * 1) 자료형을 바꾸기 가능함
(2) 회고 (접근방법, 어려운점 및 해결)
1) 1스텝으로 한번에 해결하는것보다 3스텝으로 하는것이 더 길이가 길수도 있지만,
수정가능성이나 함수화 관점에서는 바람직할수도 있다는 것을 알게되었다.
2) map[][] 에서 board[][]로 이식하는 과정에서 for문의 조건을 만들 때 규칙성을 발견하는데,(i의 위치)
머릿속으로 생각하기보다느 역시 메모나 그리면서 하는 것이 머릿속 부하를 덜 일으킬수 있다는것을 알게됨
3) 아쉬운 것이 조건문(if문)의 실행에서 최대한 간단하게 하나의 명령만 넣고싶은데 중복되게끔 한 것이 아쉽다.
'문제풀이 > 일일연습문제' 카테고리의 다른 글
일일문제 : 6번째- 221220 [12-3-화] - 1차 함수 (1) | 2022.12.20 |
---|---|
일일문제 : 5번째- 221219 [12-3-월] - 함수화 / 피라미드 (0) | 2022.12.19 |
일일문제 : 3번째- 2212115 [12-2-목] - 돌 전환시키기 (0) | 2022.12.15 |
일일문제 : 2번째- 2212114 [12-2-수] - 배열 섞기 (0) | 2022.12.14 |
일일문제 : 1번째- 221213 [12-2-화] - 갯수 구하기, 해당값 위치 구하기 (0) | 2022.12.13 |