문제풀이/일일연습문제

일일문제 : 4번째- 2212116 [12-2-금] - 보드와 돌 만들기

Mo_bi!e 2022. 12. 16. 14:38

[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문)의 실행에서 최대한 간단하게 하나의 명령만 넣고싶은데 중복되게끔 한 것이 아쉽다.