[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) 앞서 내가쓴 배열복사방식을 비슷하게 응용해서 양쪽에서 상호 교체를 하는 방식도 흥미롭다
'문제풀이 > 일일연습문제' 카테고리의 다른 글
일일문제 : 6번째- 221220 [12-3-화] - 1차 함수 (1) | 2022.12.20 |
---|---|
일일문제 : 5번째- 221219 [12-3-월] - 함수화 / 피라미드 (0) | 2022.12.19 |
일일문제 : 4번째- 2212116 [12-2-금] - 보드와 돌 만들기 (0) | 2022.12.16 |
일일문제 : 2번째- 2212114 [12-2-수] - 배열 섞기 (0) | 2022.12.14 |
일일문제 : 1번째- 221213 [12-2-화] - 갯수 구하기, 해당값 위치 구하기 (0) | 2022.12.13 |