728x90
반응형

백준알고리즘

- Bronze 3 -

 #1703. 생장점 by Java and Javascript

 


 

문제

출처: https://www.acmicpc.net/problem/1703

 


 

접근 방법

문제가 번역투라 이해하는데 시간이 조금 걸렸다.

입력되는 값의 한 줄을 봤을 때 맨 앞 숫자는 최종적인 나무의 나이이고,

이어서 나열되는 숫자들을 2개씩 잘라서 봤을 때 각 생장점 당 자라나는 나무줄기의 수와 잘라낸 가지의 수이다.

입력 예시 중 세 번째에 있는 "3 3 0 2 0 2 0"를 보면, "3 / 3 0 / 2 0 / 2 0" 으로 쪼개서 볼 수 있고, 이는 즉 3년된 나무이고, 첫 해에 3개의 가지가 돋아났으며 잘라낸 가지는 없음. 다음 해엔 각 가지마다 2개씩 돋아나고 잘라낸 가지는 0개, 마지막해에도 각 가지당 2개씩 돋아나고 잘라낸 가지는 0개 라는 말이다.

따라서 마지막 가지의 수를 a, 다음 해의 자라나는 가지의 수(생장점 당)를 b, 잘라내는 가지의 수를 c 라고 하면

다음 해의 가지의 수는 a * b - c가 된다.

 

처음 0년째의 가지의 수는 1이므로 곱셈에도 문제가 없다.

 


 

풀이

▶ Java

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int a = 0; // 나무의 나이
    	int b = 1; // 각 해에 남은 가지 수(0년차에는 1)
    	
    	while(true) {
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		a = Integer.parseInt(st.nextToken());
    		
    		if(a == 0) break;
    		
    		for(int i=0; i<a; i++) {
    			b *= Integer.parseInt(st.nextToken()); // 각 생장점마다 자라난 가지의 수를 곱해줌
    			b -= Integer.parseInt(st.nextToken()); // 잘라낸 가지의 수를 빼줌
    		}
    		System.out.println(b);
    		
    		// 초기화
    		a = 0; 
    		b = 1;
    	}
    	
    	br.close();
    }
}

 

▶ Javascript (node.js)

var fs = require('fs');

var input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
 
for(var i=0; i<input.length - 1; i++){
	main(input[i]); // \n으로 나눠서 br.readLine()의 역할을 해줌
}
 
function main(input){
	var tree = input.toString().trim().split(' ').map(Number); // st.nextToken()의 역할
	var year = parseInt(tree[0]);
	var bridge = 1;
 
	for(var i=1; i<=year*2; i+=2){ // 각 해마다 두 번의 계산이 필요하므로 year*2만큼 반복해야함
        // i는 두 개씩 커짐
		bridge *= tree[i];
		bridge -= tree[i+1];
	}
 
	console.log(bridge);
}

 


 

결과

 


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

 

728x90
반응형

+ Recent posts