ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/BOJ] 1076번 : 저항 (JAVA / 자바)
    백준 2022. 2. 12. 21:52

    안녕하세요~ 코딩하는 코알못 코메인입니다.

     

     

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

     

    1076번: 저항

    전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다. 처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다. 저항의 값은 다음 표를 이용해서 구한

    www.acmicpc.net


    - 문제 -

     

    난이도 브론즈 2 문제이다.

    자바에서 입력방식은 scanner와 bufferedreader가 있다.

    자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

    bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

    더 자세한 내용은 아래 글 참고 하면 좋다.

    https://comain.tistory.com/3

     

    (JAVA / 자바) Scanner 와 Bufferedreader

    안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

    comain.tistory.com

     

    풀이 방법

    두가지 방법으로 풀어보았다.

    1. 문제의 표를 보면 알겠지만 배열에 넣었을 경우 값들이 인덱스 값을 나타낼 수 있다. 곱을 보아도 결국 10의 인덱스 값만큼의 제곱이다.(green이면 인덱스 값은 5, 곱은 10의 5제곱이라는 것이다.) 해당 방법.

    2. switch ~ case문으로 푸는 방법.

     

    연산 값이 int형 범위를 넘어가기 때문에 정수형에 저장할땐 long형으로 선언해준다.

     

    1. 문자열 배열을 하나 만들고 거기에 표에 나와있는 색을 순서대로 저장해준다. 그리고 입력값 3개중 앞 2개는 두자리 숫자로 표현을 하고, 3번째 값은 2자리 숫자로 표현한 값에 곱해줘야한다.

    asList.indexOf를 사용해 첫번째값부터 세번째값까지의 인덱스 값을 뽑아준다. 첫번째와 두번째는 두자리로 표현해줘야하기 때문에 (3과 5이면 35로) 첫번째 값에는 *10을 해주고 두 값을 더해준다. 그리고 그렇게 나온 값에 세번째 입력값에 해당하는 값을 곱해줘야하는데 이건 10의 제곱을 해줘야하기에 Math.pow를 해준다. 코드로 보자,

     

    2. 3번 반복하는 반복문을 만들어준다. 그리고 입력값이 입력될때마다 조건에 맞는 값을 연산해줘야하기때문에 조건문을 사용해준다. if와 swich가 있지만 이렇게 조건이 다양하지 않게 여러개 있으면 switch ~ case문이 가독성에 좋다.

    문자열과 long 변수를 하나 만들어준다. 첫번째 값에 해당한 값과 두번째 값에 해당한 값은 문자열 변수에 넣어준다. 그렇게 하면 *10할 필요없이 알아서 두자리 숫자로 들어간다. 하지만 이걸 연산하기위해서는 long형으로 바꿔줄 필요가 있기때문에 Long.parseLong으로 형변환을 해준다. 그렇게 long형에 저장하고, 세번째 입력값에 해당하는 값을 곱해준다. 코드로 보자.


    -풀이-

    첫번째 방법

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    
    public class Main {
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		//색을 순서대로 집어넣은 String 형의 배열
    		String[] color = {"black", "brown", "red", "orange", "yellow", "green",
    				"blue", "violet", "grey", "white"};
    		
    		String A = br.readLine();
    		String B = br.readLine();
    		String C = br.readLine();
    		
    		//인덱스값은 정수이기 때문에 처음 수에는 *10을 해주고 두번째 값과 더해준다.
    		long result = (Arrays.asList(color).indexOf(A) * 10) + Arrays.asList(color).indexOf(B);
    		//한번에 연산하기에 너무 길어지니 두줄로 나눈다.
    		//첫번째값과 두번째값에 해당한 값을 구했으니 그 값에 세번째 값을 곱해준다.
    		result *= Math.pow(10, Arrays.asList(color).indexOf(C));
    		
    		System.out.println(result);
    	}
    
    }

     

    두번째 방법

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		//첫번째 값과 두번째 값을 저장할 문자열 변수
            String S = "";
            //최종 값을 저장할 정수형 변수 
    		long N = 0;
    		
    		for(int i = 0; i < 3; i++) {
    			String A = br.readLine();
    			
                //입력값을 판단 후 해당 값을 연산.
                //첫번째, 두번째 값과 세번째 값의 연산 방식이 다르기 때문에 조건문으로 분리
    			switch(A) {
    			case "black":
    				if(i == 2) {
    					N *= 1;
    				}else {
    					S += "0";
    				}
    			break;
    			case "brown":
    				if(i == 2) {
    					N *= 10;
    				}else {
    					S += "1";
    				}
    			break;
    			case "red":
    				if(i == 2) {
    					N *= 100;
    				}else {
    					S += "2";
    				}
    			break;
    			case "orange":
    				if(i == 2) {
    					N *= 1000;
    				}else {
    					S += "3";
    				}
    			break;
    			case "yellow":
    				if(i == 2) {
    					N *= 10000;
    				}else {
    					S += "4";
    				}
    			break;
    			case "green":
    				if(i == 2) {
    					N *= 100000;
    				}else {
    					S += "5";
    				}
    			break;
    			case "blue":
    				if(i == 2) {
    					N *= 1000000;
    				}else {
    					S += "6";
    				}
    			break;
    			case "violet":
    				if(i == 2) {
    					N *= 10000000;
    				}else {
    					S += "7";
    				}
    			break;
    			case "grey":
    				if(i == 2) {
    					N *= 100000000;
    				}else {
    					S += "8";
    				}
    			break;
    			case "white":
    				if(i == 2) {
    					N *= 1000000000;
    				}else {
    					S += "9";
    				}
    			break;
    			}
                //두번째 값까지 연산이 되었다면 정수형에 형변환해서 저장
    			if(i == 1) {
    				N = Long.parseLong(S);
    			}
    		}
    		System.out.println(N);
    	}
    
    }

    -결과-

    위 : 첫번째 방법, 아래 두번째 방법


    아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.

    댓글