728x90
반응형

백준알고리즘

- Bronze 2 -

 #4864. Gold Coins by Java and Javascript

 

사족

2022.04.11 ~

지난 2022년 4월, 프로젝트에 투입되었으나 사업장에 자리가 없어 한 달여간을 본사에서 대기하면서 백준 알고리즘을 풀고 블로그에 글을 쓰기 시작했다. 나름 꾸준히 잘 풀다가 평일 중 못 푼 만큼 주말에 풀고 그러다보니 예쁘지도 않고 루틴화가 되지 않는 것에 스트레스를 받아서 8월에 휴가기간에 쉰 뒤 주5일 꾸준히 풀었다. 꾸준히 풀다보니 어느덧 브론즈5와 브론즈4단계를 다 풀고 브론즈3으로 넘어갔다.

 

2023년 들어서는 새로 생긴 브론즈4와 브론즈3을 포함해 브론즈3까지 총 3문제를 각각 java와 javascript(node.js)로 풀고 있었다가 일이 바빠지면서 4월엔 브론즈 3과 브론즈2만 풀었다. 5월 첫 주 연휴도 있었고, 여러 일로 번아웃이 와서 쉬고, 무리하지 않기 위해 한 문제씩 다시 달리는 중,, 


 

문제

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

번역: https://www.acmicpc.net/board/view/91195

 

* 갈수록 번역이 없어 문제푸는게 힘들다..


 

접근 방법

일종의 계차수열이다.

처음 시작 수가 {1, 2, 4, 7, 11 ... } 로, 1, 2, 3, 4... 순으로 커지는 수열이다.

그리고 각 순서마다 코인이 1개(1원), 2개(2원), 3개(3원), 4개의 코인이 더해진다.

따라서 i는 1부터 입력값(=day)까지이고, 증가하는 수를 cnt로 설정해서 i에 더해주면 된다.

1번째: 1

2번째: 2(=1+1) 3

3번째: 4(=2+2) 5 6

4번째: 7(=4+3) 8 9 10

...

 

자세한건 코드에서 보자.


 

풀이

▶ Java

import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		// Code Start
		String line = ""; // 입력을 받을 변수
		String res = ""; // 출력할 변수
		while(!"0".equals(line=br.readLine())){ // 입력값이 0이 아닐때 계속 반복
			res += line + " "; // 입력값(day)에 공백을 더해준 문자열
			int day = Integer.parseInt(line); // 계산을 위해 int로 파싱
			int coin = 0; // 총 코인 값
			int cnt = 1; // 횟수(또는 차수)
			int idx = cnt; // cnt만큼 반복해서 더해주는데, 중간에 끊기는 수 때문에 설정한 변수
			for(int i=1; i<=day;) {
            			// i번째 때 cnt번 반복한 횟수가 총 횟수(day)보다 크면 day-i+1번 반복
                		// 아니면 cnt번 반복하기 위함
				idx = (i + cnt > day) ? day-i+1 : cnt;
                
                		// 횟수만큼 coin을 더해준다.
				for(int j=1; j<=idx; j++) {
					coin += cnt;
				}
				i += cnt; // i 증가
				cnt++; // cnt 증가
			}
			res += coin + "\n"; // 각 회차마다의 코인값 입력
		}
		
		bw.write(res); // 정답 출력
		// Code End
        
		bw.flush();
		bw.close();
		br.close();
	}
}

 

▶ Javascript (node.js)

var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim().split('\n').map(v => +v);
var res = '';

for(var i=0; i<input.length-1; i++){
    var day = input[i];
    var coin = 0, cnt = 1, idx = cnt;

    for(var j=1; j<=day;){
        idx = (j + cnt > day) ? day - j + 1 : cnt;

        for(var k=1; k<=idx; k++){
            coin += cnt;
        }
        j += cnt;
        cnt++;
    }

    res += day + ' ' + coin + '\n';
}
console.log(res.trim());

 


 

결과

 


블로그 글도 중요하긴 한데,, 좀처럼 틈이 안나서 일단은 잔디 심는걸로 만족하는 중..

출퇴근에 잔디에 운동에 바쁘다바빠 현대사회..


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

 

728x90
반응형

+ Recent posts