TIL

day12 TIL

dalooong 2023. 7. 7. 01:02

2023-05-02 화

반복문

반복문은 초기화식, 조건식, 증감식 세 가지로 구성되어 { } 중괄호 영역을 반복해 실행시키는 ‘문’이다. 초기화식, 조건식, 증감식에 따라 i가 변화하고 변화한 i는 { } 중괄호 영역에서 사용된다.

6-1. for문

  • 반복횟수를 알고 있을 때 주로 사용
  • 주로 배열과 함께 사용
  • for문의 작성 형식과 실행흐름
  •  

  • for문 사용 예시
  • /* for (초기화식; 조건식; 증감식) { 코드 } */ for (int i = 0; i < 10; i++) { System.out.println(i); } // 출력결과 : 0 1 2 3 4 5 6 7 8 9
  • for문을 while문 처럼 사용 가능(Codeup1620 풀이2 캡션 참조)

6-2. 중첩 for문

for문을 중첩해서 쓰기 때문에 중첩 for문이라고 부른다.

  • 사용 예시
  • for (int j = 2; j <= 4; j++) { // {반복문} for (int i = 1; i <= 9; i++) { // (반복문) } }
  • 첫 반복문에서 변수 i를 이미 쓰고 있기 때문에 감싸지는 {반복문}에서는 j를 사용하고 초기화식, 조건식, 증감식에서 모두 j를 사용한다.
  • 중첩 for문 활용 예시 (2 ~ 4단 구구단 출력)
  • for (int j = 2; j <= 4; j++) { for (int i = 1; i <= 9; i++) { System.out.printf("%d * %d = %d\\n",j, i, j * i); } }

6-3. while문

  • 조건식이 true 일 경우에 반복
  • 무한 루프나 특정 조건에 만족할 때 까지 반복하는 경우, 파일 읽고 쓰기에 사용
  • while(조건식) → 조건식 안에 boolean이 들어가면 된다. while(1) 불가 →C, C++에서는 가능
  • while문의 작성형식과 실행흐름

  • while문의 작성형식과 실행흐름while문 작성형식과 실행흐름 이미지
  •  
/*
while(조건식){
	//수행
}*/

int i = 0
while(i < 10) {
	System.out.println(i);
	i++;
}  // 출력결과 : 0 1 2 3 4 5 6 7 8 9

(추가) do-while문

  • while문과 동일하나 무조건 한번 실행 한 뒤, 조건을 검사하여 반복 여부를 결정
  • 반드시 한번은 수행해야 하는 경우 사용 (Codeup1620 2번째 풀이)
  • 사용자의 입력과 함께 로직이 구성되는 부분에 사용
  • do-while문의 작성형식과 실행흐름
/*
do{
	//수행
}while(조건식)
*/

int i = 0
do {
	System.out.println(i);
	i++;
}  while(i < 10)
// 출력결과 : 0 1 2 3 4 5 6 7 8 9

BufferedWriter 클래스

  • java.io 에 속한 클래스. 출력할 데이터가 버퍼를 거쳐 출력되게 한다.벽돌 100개를 카트에 담아 한번에 옮기는 것 (모아서 출력) > BufferedWriter
  • 벽돌 한개를 100번씩 왔다갔다 하면서 옮기는 것 (매번 출력) > System.out.println();
  •  

  • BufferWriter를 사용하는 경우 CodeUp 1084 문제를 풀 때, System.out.println(); 을 이용해 출력하면 시간이 초과된다.
//1084번을 System.out.println() 으로 출력하는 경우

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n1 =sc.nextInt();
        int n2 =sc.nextInt();
        int n3 =sc.nextInt();
        int cnt = 0;
        for(int i=0;i<n1;i++){
            for(int j=0;j<n2;j++){
                for(int k=0;k<n3;k++){
                    System.out.printf("%d %d %d\\n",i,j,k);
                    cnt++;
                }
            }
        }
        System.out.println(cnt);
    }
}

처리시간이 4000ms 이상인 것을 확인할 수 있음.

//1084번을 BufferedWriter를 이용해 출력하는 경우

import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        int l1 = sc.nextInt();
        int l2 = sc.nextInt();
        int l3 = sc.nextInt();
				
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int cnt = l1 * l2 * l3;
        for (int i = 0; i < l1; i++) {
            for (int j = 0; j < l2; j++) {
                String str = "";
                for (int k = 0; k < l3; k++) {
                    str += i +" " + j + " " + k + "\\n";
                }
                bw.write(str);
                bw.flush();
            }
        }
        System.out.println(cnt);
    }
}

처리시간이 1000ms 정도로 4배 정도의 빠른 결과를 도출함.

//선언하기
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

//출력할 문자열
String str = "ABC";

//출력 (int , char , String 형 데이터를 버퍼에 출력. 자동개행 기능 없음)
bw.write(str); 

//줄바꿈 (개행)
bw.newLine();

//버퍼안에 남은 데이터 모두 출력
bw.flush();

//스트림 닫기. close()전에는 flush() 해야함.
bw.close();