문제풀이/일일연습문제

일일문제 : 3번째- 2212115 [12-2-목] - 돌 전환시키기

Mo_bi!e 2022. 12. 15. 14:35

[5]

1. 문제설명

// 1. res/alphabet.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.

//   abcdefghijklmn

 

// 2. alphabet이라는 이름으로 문자 15개를 저장할 수 있는 배열 객체를 생성한다.

[      ] alphabet = [                                    ];

 

// 3. res/alphabet.txt 파일에 저장된 구분자가 없는 영문자 값들을 alphabet 배열에 로드한다. 

{

     // 코드를 작성하는 공간



    System.out.println(“로드 완료”);

}

 

// 3. 배열의 값이 다음과 같은 상태가 되도록 자리를 바꾼다.

//    nmlkjihgfedcba

 

{

     // 코드를 작성하는 공간




    System.out.println(“자리변경 완료”);

}

 

// 4. res/alphabet-out.txt 파일로 배열의 값들을 저장 

{

     // 코드를 작성하는 공간

 

    

 

    System.out.println(“저장 완료”);

}

2. 나의 해답과 다른 해답 

package T221215;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		
		// 1. res/alphabet.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
	//   abcdefghijklmn
		
	// 2. alphabet이라는 이름으로 문자 15개를 저장할 수 있는 배열 객체를 생성한다.
	char[] alphabet = new char [15];

	// 3. res/alphabet.txt 파일에 저장된 구분자가 없는 영문자 값들을, alphabet 배열에 로드한다. 
	{
	     // 코드를 작성하는 공간
		FileInputStream fis = new FileInputStream("res/alphabet.txt");
		
		
		//1번방법
		Scanner scan = new Scanner(fis);
		String alphabets = scan.nextLine();
		
		alphabet = alphabets.toCharArray();
		
		//2번 방법
//		for(int i = 0 ; i < alphabet.length ; i++) 
//			alphabet[i]= (char) fis.read();
		
		//3번 방법
//		Scanner scan = new Scanner(fis);
//		String alphabets = scan.nextLine();
//		
//		for(int i = 0 ; i < alphabet.length - 1 ; i++) 
//			alphabet[i] = alphabets.charAt(i);

		
		//----출력
		
		for(int i = 0 ; i < alphabet.length ; i++) {
			System.out.printf("%c" , alphabet[i]);
		}
		System.out.println("\n로드 완료");
		

	}
	// 3. 배열의 값이 다음과 같은 상태가 되도록 자리를 바꾼다.
//	    nmlkjihgfedcba

	{
		//1번방법
		char [] temp = new char [alphabet.length] ;
		
		for(int i = 0 ; i < temp.length ; i ++) 
			 temp[(temp.length - 1)  - i] = alphabet[i]; //깊은복사 
		
		alphabet = temp; //얕은복사 
		//여기가 가장 큰 문제
		
		//2번방법
//		for(int j = 0 ; j < alphabet.length - 1; j++)
//			for(int i = 0 ; i < alphabet.length -1 - j ; i ++) {
//				
//				if(alphabet[i] < alphabet[i+1]) {
//					char tmp = alphabet[i];
//					alphabet[i] = alphabet[i+1];
//					alphabet[i+1] = tmp;
//				}
//			}
		
		for(int i = 0 ; i < alphabet.length ; i++) {
			System.out.printf("%c" , alphabet[i]);
		}
		
	    System.out.println("\n자리변경 완료");
	    
	}

	// 4. res/alphabet-out.txt 파일로 배열의 값들을 저장 
	{
		FileOutputStream fos = new FileOutputStream("res/alphabet-out.txt");

		//1번방법
		PrintStream ps = new PrintStream(fos);
	    ps.print(alphabet);
	    
		//2번방법
//		for(int i = 0 ; i < alphabet.length - 1 ; i++) 
//			fos.write(alphabet[i]);
		
	    System.out.println("저장 완료");
	}
	
	
	}}

 

3. 정답 코드

상기 입력의 3가지방법

상기 계산의 2가지방법

상기 출력의 2가지방법

4. 보충 및 회고

(1) 보충

1) charAT에 대한 이해

당초에는 String 문자열에 대한 함수 charAt 은 인덱스를 리턴하는것으로 잘못이해했다. 그러나 실제로 charAt은 인덱스값을 받아서 당해 인덱스 위치에 있는 문자를 반환하는 것이다.

 

그렇다면 indexof()는 해당하는 문자의 인덱스를 리턴하는 것이다

 

결국 indexof()charAt()을 구분해야한다.

 

2) read() , write() 에 대한 인수및 리턴자료형 이해

 

 

3) 배열 얕은복사 깊은복사

깊은복사는 값까지 복사하는것 얕은복사는 참조되어있는 배열에 대한 복사를 의미한다.

당초에 실수로 반복문안에 깊은복사뿐만 아니라 얕은복사까지 했다.

그 결과 같은 내용에 대한 복사가 이루어 져서 더이상 의미없는 깊은복사가 이루어진다.

 

 

(2) 회고

1) 어제 집가는 길에 배웠던 배열 복사 방식을 이용해서 문제를 해결 한 점이 뿌듯하다.

 

2) 반복적으로 String까지 읽을필요가 없을 수도 있다.

 

3) close를 해주어 누수를 방지해주자


 

 

[6번]

1. 문제설명

// 1. res/bitmap.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.

 

11111111110000000000

11111111100000000000

11111111000000000000

11111110000000000000

11111100000000000000

11111000000000000000

11110000000000000000

11100000000000000000

11000000000000000000

10000000000000000000



2. bitmap이라는 이름으로 20X10크기의 정수를 담을 수 있는 이차원 배열을 생성하시오.

 

[           ]  bitmap = [                                      ];

 

3. 다음 그림과 같은 모양이 되도록 값의 위치를 변경하시오

00000000001111111111

00000000000111111111

00000000000011111111

00000000000001111111

00000000000000111111

00000000000000011111

00000000000000001111

00000000000000000111

00000000000000000011

00000000000000000001

 

{

     // 코드를 작성하는 공간




    System.out.println(“자리변경 완료”);

}



// 4. res/bitmap-out.txt 파일로 bitmap 배열의 값들을 저장 

{

     // 코드를 작성하는 공간

 

    

 

    System.out.println(“저장 완료”);

}

2. 나의 해답

package T221215;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class Test6 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

//		1. res/bitmap.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
		
//		2. bitmap이라는 이름으로 20X10크기의 정수를 담을 수 있는 이차원 배열을 생성하시오.
		int [][] bitmap = new int [10][20];
		
		{
		FileInputStream fis= new FileInputStream("res/bitmap.txt");
		Scanner scan = new Scanner(fis);
		
		System.out.println("길이 계산");
		System.out.println(bitmap[0].length); //20
		System.out.println(bitmap.length); //10
		
		for(int i = 0 ; i < bitmap.length; i++) {
			String numLine = scan.nextLine();
//			System.out.println("라인 읽어오기: ");
//			System.out.println(numLine);
			
			for(int j = 0 ; j < bitmap[i].length ; j++) {
		
				String [] token = numLine.split("");
//				System.out.print(token[j] + " ");
				int tmp = Integer.parseInt(token[j]);
				bitmap[i][j]=  tmp;
			}
			
			
		}
		
		System.out.println("bitmap은");
		//출력용
		for(int i = 0 ; i < bitmap.length; i++) {
			for(int j = 0 ; j < bitmap[i].length ; j++) {
				System.out.print(bitmap[i][j]);
				}	
			System.out.println();
			}
		
		scan.close();
		fis.close();
		}
//		3. 다음 그림과 같은 모양이 되도록 값의 위치를 변경하시오
//		00000000001111111111
//		00000000000111111111
//		00000000000011111111
//		00000000000001111111
//		00000000000000111111
//		00000000000000011111
//		00000000000000001111
//		00000000000000000111
//		00000000000000000011
//		00000000000000000001

		{ //저장 후 결과물 출력하는 곳
			for(int i = 0 ; i < bitmap.length  ; i++) {
				for(int k = 0 ; k < bitmap[i].length -1 -1 ; k++) 
					for(int j = 0 ; j < bitmap[i].length -1 -k ; j++) {
						
						if( bitmap[i][j] > bitmap[i][j + 1]) {
							int tmp = bitmap[i][j];
							bitmap[i][j] = bitmap[i][j + 1] ;
							bitmap[i][j + 1] = tmp ;
						}}
			}
		
				
		    System.out.println("\n자리변경 완료");
		    System.out.println("bitmap은");
		    
		    for(int i = 0 ; i < bitmap.length; i++) {
				for(int j = 0 ; j < bitmap[i].length ; j++) {
					System.out.print(bitmap[i][j]);
					}	
				System.out.println();
				}
		}
		// 4. res/bitmap-out.txt 파일로 bitmap 배열의 값들을 저장 
		{
		     // 코드를 작성하는 공간
			
			FileOutputStream fos = new FileOutputStream("res/bitmap-out.txt");
			PrintStream out = new PrintStream(fos);
		    
			for(int i = 0 ; i < bitmap.length; i++) {
				for(int j = 0 ; j < bitmap[i].length ; j++) {
					out.print(bitmap[i][j]);
				}
				out.println();
			}

		    System.out.println("\n저장 완료");
		    
		    out.close();
		    fos.close();
		}


		
	}

}

 

3. 정답 코드

 

4. 보충 및 회고

(1) 보충

1) 파일에서 읽어온 내용을 배열에 저장하는 과정에 대한 다양한 방식의 접근을 생각해보자

 

 

(2) 회고

1) 계산과정에서 바로 전체틀을 만들기보다는 해결과정을 쪼개어서 차례대로 만들어가면서 접근하는것이 사고를 쉽게할 수 있고, 문제를 해결할 수 있고, 중간결과를 만들 수 있어서 쉬운것 같다.

 

-박*민 의 풀이방식

1) 문제의 조건에 파일에서 받아온 값을 배열에 저장한 후 계산하라는 의미가 아니었다. 때문에 사실 파일에 받아온 값을 바로 출력값으로 인덱스값을 바꿔서 할수 있다는 점에서 흥미로웠다.

 

2) 앞서 내가쓴 배열복사방식을 비슷하게 응용해서 양쪽에서 상호 교체를 하는 방식도 흥미롭다