문제풀이/일일연습문제

일일문제 : 2번째- 2212114 [12-2-수] - 배열 섞기

Mo_bi!e 2022. 12. 14. 11:51

[4번]

1. 문제설명

다음 각 절차를 따라 작성하시오.

 

// 1. nums라는 이름으로 정수 15개를 저장할 수 있는 배열 객체를 생성한다.

int nums = 

 

// 2. res/data.txt 파일에 저장된 값들을 nums 배열에 로드한다. 

{

     // 코드를 작성하는 공간



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

}

 

// 3. 0~14 범위의 랜덤값 2개를 얻어서  그 위치의 값을 서로 바꾼다. 그것을 50번 반복한다.

{

     // 코드를 작성하는 공간



    System.out.println(“번호 섞기 완료”);

}

 

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

{

     // 코드를 작성하는 공간

 

    

 

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

}

2. 나의 해답

package T221214;

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

public class Test4 {

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

		// 1. nums라는 이름으로 정수 15개를 저장할 수 있는 배열 객체를 생성한다.
		int [] nums = new int[15];
		System.out.println("정수형 배열 생성완료 ");
		
		// 2. res/data.txt 파일에 저장된 값들을 nums 배열에 로드한다. 
		
		FileInputStream fis = new FileInputStream("res/data.txt");
		//data.txt 파일과 연결하여 fis라는 참조의 연결통로(입력전용)를 만든다.		
		Scanner scan = new Scanner(fis); 
		//만들어진 fis연결통로에 scan참조로 버퍼를 만든다.
		
		String numLine = scan.nextLine();
		String [] token = numLine.split(" ");
		
		
		for(int i = 0 ; i < nums.length ; i ++) 
			nums[i] = Integer.parseInt(token[i]);
			
		for(int i = 0 ; i < nums.length ; i ++) 
			System.out.printf("%d, ",nums[i]);
		System.out.println();
		System.out.println("nums배열에 로드 완료 ");
		
		// 3. 0~14 범위의 랜덤값 2개를 얻어서  그 위치의 값을 서로 바꾼다. 그것을 50번 반복한다.
		Random rand = new Random();
		int x = 0 ;  int y = 0 ;
		
		for(int i = 0 ; i < 50 ; i++) {
			x = rand.nextInt(15);
			y = rand.nextInt(15);
			
			
			int temp = nums[x];
			nums [x] = nums[y]; 
			nums [y] = nums[x]; 
			System.out.printf("\n%d번째 %d와 %d 번째 숫자 교환 완료", i + 1,x, y);
		}
		System.out.println("\n\n50번 값 바꾸기 완료 \n");
		
		System.out.print("최종 배열의 값은 : ");
		for(int i = 0 ; i < nums.length ; i ++) 
			System.out.printf("%d, ",nums[i]);
		
		
		// 4. res/data-out.txt 파일로 배열의 값들을 저장 
		System.out.println();

		FileOutputStream fos = new FileOutputStream("res/data-out.txt");
		//data.txt 파일과 연결하여 fos라는 참조의 연결통로(출력전용)를 만든다.	
		PrintStream ps = new PrintStream(fos);
		//만들어진 fos연결통로에 ps참조로 버퍼를 만든다.
		
		
		for(int i = 0 ; i < nums.length ; i ++) {
			ps.printf("%d", nums[i]);
		
			if(i == 14)
				ps.print("");
			else
				ps.print(",");
		}
		System.out.println("배열값 저장 완료 ");
		
		scan.close();
		fis.close();
		ps.close();
		fos.close();
	}

}

콘솔 : 21 (오답)

3. 정답 코드

public static void main(String[] args) throws IOException {

		// 1. nums라는 이름으로 정수 15개를 저장할 수 있는 배열 객체를 생성한다.
		int nums[] = new int[15];

		// 2. res/data.txt 파일에 저장된 값들을 nums 배열에 로드한다.
		FileInputStream fis = new FileInputStream("res/data.txt");
		Scanner scan = new Scanner(fis);

		for (int i = 0; scan.hasNext(); i++)
			nums[i] = scan.nextInt();


		scan.close();
		fis.close();
		System.out.println("로드 완료");

		// 3. 0~14 범위의 랜덤값 2개를 얻어서 그 위치의 값을 서로 바꾼다.
		// 그것을 50번 반복한다.
		Random rand = new Random();

		int a, b, temp;

		for (int i = 0; i < 50; i++) {
			a = rand.nextInt(15);
			b = rand.nextInt(15);

			temp = nums[a];
			nums[a] = nums[b];
			nums[b] = temp;
		}
		System.out.println("번호 섞기 완료");

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

		for (int i = 0; i < 15; i++) {
			out.printf("%d", nums[i]);
			if (i != 14)
				out.print(',');
		}
		out.close();
		fos.close();
}

 

4. 보충 및 회고

(1) 보충

1) FileInputStream / Scanner / FileOutputStream /  PrintStream 에 대한 이해

 

- FileInputStream / Scanner

FileInputStream fis = new FileInputStream("res/data.txt");
//data.txt 파일과 연결하여 fis라는 참조의 연결통로(입력전용)를 만든다.		
Scanner scan = new Scanner(fis); 
//만들어진 fis연결통로에 scan참조로 버퍼를 만든다.

- FileOutputStream /  PrintStream

FileOutputStream fos = new FileOutputStream("res/data-out.txt");
//data.txt 파일과 연결하여 fos라는 참조의 연결통로(출력전용)를 만든다.	
PrintStream ps = new PrintStream(fos);
//만들어진 fos연결통로에 ps참조로 버퍼를 만든다.

2) close()를 이용해서 객체 닫아주기

Scanner, Fileout/input, PrintStream에 대한 close가 필요.

close()가없으면 객체는 메모리가 쌓이기 때문에 느려짐

그러므로 의식적으로 닫아주는 것을 생각해야한다.

 

3) Integer.parseInt () 이용에 대한 용례

문자를 정수화시킬 문자를 인수안에 넣어주어야한다.

 

4) rand.nextInt()

 인수안의 숫자는 갯수이고, 0부터 시작하기 때문에 갯수 -1을 해야 원하는 숫자까지 가능 함

 

5) , " " 출력에 대한 조건

특정인덱스가 아닐 때 까지만 , (쉼표)가 출력되게끔 간단하게 조건문을 만들 수 있다.

 

 

(2) 회고

 

1) FileInputStream / Scanner / FileOutputStream /  PrintStream 에 대해서 설명할 수 있게 되었다.

스트림이라는 길을 만들고, 버퍼라는 열차를 지나가게끔 하기

 

2)  Integer.parseInt () 에 대해서 아직 제대로 나만의 것으로 사용하기에는 어렵다는 것을 알게되었다.