티스토리 뷰

백준

반복문 (1)

xoo | 수진 2024. 3. 30. 12:37

1️⃣ 2739 번: 구구단

https://www.acmicpc.net/problem/2739

 

2739번: 구구단

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

www.acmicpc.net

 

💻 나의 풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        
        for(int i = 1; i <= 9; i++) {
            System.out.println(n + " * " + i + " = " + n * i);
        }
    }
}

 

가장 기본적인 반복문 문제입니다.

숫자 n을 입력 받는데 n은 1보다 크거나 같고 9보다 작거나 같습니다.

 

 


 

2️⃣ 10950번: A+B-3

https://www.acmicpc.net/problem/10950

 

10950번: A+B - 3

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

💻 나의 풀이

import.java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int t = sc.nextInt();
        
        for(int i = 0; i < t; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            
            System.out.println(a+b);
        }
    }
}

 


 

 

3️⃣ 8393번:  합

https://www.acmicpc.net/problem/8393

 

8393번: 합

n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

💻 나의 풀이

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int sum = 0;
        
        for(int i = 0; i <= n; i++) {
            sum += i;
        }
        
        System.out.println(sum);
    }
}

 


 

 

4️⃣ 25304번:  영수증

https://www.acmicpc.net/problem/25304

 

25304번: 영수증

준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것

www.acmicpc.net

 

💻 나의 풀이

이차원 배열을 써서 해결하는 코드와 쓰지않는 코드 두 가지가 있는데

먼저 이차원 배열을 쓰지않는 코드입니다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int x = sc.nextInt();   // 총 금액
        int n = sc.nextInt();   // 구매한 물건 종류 개수
        
        int totalPrice = 0;  // 총 금액이 맞는지 비교
        
        for(int i = 0; i < n; i++) {
            int price = sc.nextInt();  // 상품가격
            int count = sc.nextInt();  // 상품개수
            
            totalPrice += price * count;
        }
        
        if(x == totalPrice) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}

 

이차원 배열 대신 각 물건의 가격과 개수를 따로 변수로 저장하고, 반복문을 통해 총 가격을 계산합니다.

코드 자체는 더 직관적이고 간결해지지만, 물건의 종류가 많아질수록 변수의 개수가 증가하므로 관리가 어려워질 수 있습니다.

그리하여, 이차원 배열을 사용하는 코드를 다시 작성해봤습니다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int x = sc.nextInt();   // 총 금액
        int n = sc.nextInt();   // 구매한 물건 종류 개수
        
        int product[][] = new int[n][2];  // [0]: 상품가격 [1]: 상품개수
        
        // 총 금액이 맞는지 비교
        int comp = 0; 
        for(int i = 0; i < product.length; i++) {
            product[i][0] = sc.nextInt();  // 상품가격
            product[i][1] = sc.nextInt();  // 상품개수
            comp += product[i][0] * product[i][1];  // 총 금액 계산 = 각 물건의 가격과 개수를 곱한 값을 더한다.
        }
        
        // 입력받은 총 금액과 계산된 총 금액이 같은지 비교
        if(x == comp) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}

 

이차원 배열을 사용하는 이유는 각 물건의 가격과 개수를 한 쌍으로 관리하기 위해서입니다.

 


 

 

5️⃣ 25314번:  코딩은 체육과목 입니다

https://www.acmicpc.net/problem/25314

 

25314번: 코딩은 체육과목 입니다

오늘은 혜아의 면접 날이다. 면접 준비를 열심히 해서 앞선 질문들을 잘 대답한 혜아는 이제 마지막으로 칠판에 직접 코딩하는 문제를 받았다. 혜아가 받은 문제는 두 수를 더하는 문제였다. C++

www.acmicpc.net

 

💻 나의 풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int div = n / 4;
        
        for(int i = 0; i < div; i++) {
            System.out.print("long ");
        }
        
        System.out.println("int");
    }
}

 

4의 배수를 입력하고 그 배수만큼 long을 출력해줍니다.

4로 나눈 몫만큼 for문을 돌려서 long을 출력합니다.


 

 

6️⃣ 15552번: 빠른 A+B 

https://www.acmicpc.net/problem/15552

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

 

💻 나의 풀이

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

문제에 위와 같은 말이 있기 때문에 이번에는 BufferedReader를 사용해봅시다.

💡 BufferedReader
Java에서 효율적인 텍스트 입력을 위한 클래스입니다. 이 클래스는 입력 스트림에서 문자를 읽어오는데, 내부적으로 데이터를 버퍼에 저장하여 한 번에 여러 문자를 읽어올 수 있습니다. 이로 인해 입출력 작업이 더 효율적으로 이루어집니다.
BufferedReader를 사용하면 프로그램이 입력 스트림으로부터 데이터를 한 문자씩이 아닌 더 큰 블록 단위로 읽어들일 수 있으므로 입출력 속도가 향상됩니다. 특히 대용량 데이터를 처리할 때 유용합니다.
아래는 BufferedReader를 사용하여 표준 입력에서 한 줄을 읽어오는 예제 코드입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        try {
            String line = br.readLine(); // 한 줄을 읽어옴
            System.out.println("입력된 값: " + line);
            
            br.close(); // BufferedReader를 닫음
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
BufferedReaderSystem.in을 통해 표준 입력으로부터 데이터를 읽어옵니다.
readLine() 메서드를 사용하여 한 줄을 읽어오고, 읽은 문자열을 출력합니다.
마지막으로
close() 메서드를 호출하여 BufferedReader를 닫아줍니다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        
        // 입력을 받기 위한 BufferedReader 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 출력을 위한 BufferedWriter 객체 생성
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // StringTokenizer를 사용하기 위한 객체 생성
        StringTokenizer st;
        
        // 테스트 케이스의 개수를 입력으로 받음
        int t = Integer.parseInt(br.readLine());
        
        // 테스트 케이스의 개수만큼 반복
        for(int i = 0; i < t; i++) {
            // 한 줄을 읽고 공백을 기준으로 문자열을 토큰으로 나눔
            st = new StringTokenizer(br.readLine());
            // 첫 번째 숫자를 읽어와서 정수로 변환하여 변수 a에 저장
            int a = Integer.parseInt(st.nextToken());
            // 두 번째 숫자를 읽어와서 정수로 변환하여 변수 b에 저장
            int b = Integer.parseInt(st.nextToken());
            // a와 b를 더한 결과를 문자열로 변환하여 BufferedWriter에 기록
            bw.write((a+b) + "\n");
        }
        
        // 출력 버퍼를 비움
        bw.flush();
        // 입력 버퍼를 닫음
        br.close();
        // 출력 버퍼를 닫음
        bw.close();
        
    }
}

 

Scanner 사용하다가 BufferedReader로 하려니까 적응이 안되네요;

import문부터가 더럽게 길어졌는데... import java.io.*; 로 편하게 쓰는 방법도 있습니다!

 

    • readLine(); 메서드를 사용해 입력하는데, String으로 리턴 값이 고정돼있기 때문에 내가 입력받고자 하는 값이 다른 타입이라면 반드시 형변환을 해주어야 합니다.   =>   Integer.parseInt();
    • BufferReader는 한 라인을 그대로 읽어오기 때문에 StringTokenizer를 사용해 BufferReader를 통해 읽어온 데이터를 공백 단위로 가공해주는 작업을 합니다.  =>  st = new StringTokenizer(br.readLine(), " ");
    • StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있습니다.
    • Scanner와 달리 IOException 예외처리를 해주어야 합니다.
      • try catch문으로 하거나 
      • throws Exception으로 처리해주면 됩니다.
💡 BufferedReader 의 경우 close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리됩니다. 즉, close()를 콜해주지 않아도 문제는 없습니다.

💡 BufferedWriter
의 경우 writing을 끝낸 후 적절하게 close()를 해주지 않는다면 정상적으로 writing이 되지 않는 경우가 많습니다.

'백준' 카테고리의 다른 글

조건문  (0) 2024.03.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함