[알고리즘] 백준 10179 쿠폰

박세진·2021년 2월 11일
0
post-thumbnail

오랜만에 블로그 글을 쓴다.
요 며칠은 할일이 많아서 바쁜 탓에 블로그를 잘 들어오지 못했다. 그래서 설 연휴기간동안 다시 공부도 하고 블로그 포스팅도 하려고 한다.

자바 알고리즘 문제가 풀고싶어 백준 사이트에 들어갔다. 그리고 느낀점은.. 나는 아직도 배울것이 많다는 것이다.
단순한 입출력 구문에서도 헷갈리거나 안되는 부분이 있었다.

그래서 기초부터 차근차근 해보기 위해 난이도 낮은 문제부터 풀어보려고 한다.


다음은 10179번 문제를 캡처한 것이다.

문제를 풀면서 잘 몰랐던 부분에 대해서도 정리하고자 한다.
다음은 필자가 짠 코드이다.

package study.test.algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Coupon {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int testCaseNum = Integer.parseInt(br.readLine()) ; 
		
		double[] arr = new double[testCaseNum];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = Double.parseDouble(br.readLine()) * 0.8;
		}
		// 출력하기
		for (int j = 0; j < arr.length; j++) {
			System.out.println(String.format("$%.2f", arr[j]));
		}
	}
}

위의 코드를 차근차근 정리하면서 설명하겠다.

우선, 테스트 케이스의 수를 입력받아야 하기 때문에 입력을 위한 BufferedReader를 사용했다.
Scanner 로 입력받는 것이 간단하겠지만 입력값이 많을 경우에 BufferedReader를 사용하는 것이 속도 면에서 더 좋아서 필자는 BufferedReader를 사용했다.

int testCaseNum = Integer.parseInt(br.readLine()) ; 

BufferedReader에는 read() 메소드와 readLine() 메소드가 있다.

  • read() : 입력받은 문자의 아스키코드 값을 리턴
int num = br.read(); 

ex) 사용자가 1을 입력 : char형의 '1'을 입력받은 것과 같다.
그때의 출력값은 아스키코드 값인 49가 된다.

  • readLine() 메소드 : 한줄 단위로 데이터(문자열)을 읽어오는 메소드
    ex) 사용자가 입력하고 나서 엔터키를 누를 때 까지의 문자열을 읽어온다.

필자는 readLine() 메소드를 사용해서 읽은 뒤, Integer.parseInt() 를 이용해 문자열을 정수로 바꿨다.

그 다음, testCaseNum 만큼 입력값을 받아야 한다. 이때 소수점 자리까지 입력값이 있기 때문에 int 형이 아닌 double 형을 사용했다.
여러개의 값이 있으므로, double 형의 배열을 이용해 값을 저장하자.

double[] arr = new double[testCaseNum];

배열에 값을 저장할 때에는, 20% 할인했을 때의 가격을 저장할 것이다.
따라서 입력받은 값에 0.8 만큼을 곱해서 저장하자.

double[] arr = new double[testCaseNum];
	for (int i = 0; i < arr.length; i++) {
		arr[i] = Double.parseDouble(br.readLine()) * 0.8;
	}

입력값을 읽은 뒤 Double.parseDouble()로 double 형으로 변환해주고 * 0.8을 했다.

출력할 때에는 $ 를 붙여야 하고, 소수점 2번째 자리까지 반올림해서 출력해야 한다.
Math.round() 함수를 사용하면 무조건 소수점 첫번째 자리를 반올림해서 정수값을 리턴하기 때문에, 필자는 String.format() 메서드를 이용했다.

	for (int j = 0; j < arr.length; j++) {
		System.out.println(String.format("$%.2f", arr[j]));
	}

참고하기

배열의 값을 눈으로 확인하고 싶을때는 Arrays.toString()을 이용하면 된다.
ex)

System.out.println(Arrays.toString(arr)); 

그렇게 어렵지 않은 문제였지만, 입출력을 하는 부분이나 형변환, 원하는 출력형태를 쓰기 위한 String.format()등 여러부분을 다시 공부하는 계기가 되었다.

profile
계속해서 기록하는 개발자. 조금씩 성장하기!

0개의 댓글