백준알고리즘
- Bronze 2 -
#4864. Gold Coins by Java and Javascript
사족
지난 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 괴발개발 개발일지
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘] #2455. 지능형 기차 (by Java and Javascript) (0) | 2022.09.28 |
---|---|
[백준알고리즘] #1703. 생장점 (by Java and Javascript) (0) | 2022.09.14 |
[백준알고리즘] #1598. 꼬리를 무는 숫자 나열(by Java and Javascript) (0) | 2022.09.13 |
[백준알고리즘] #1547. 공 (by Java and Javascript) (0) | 2022.09.12 |
[백준알고리즘] #1284. 집 주소 (by Java and Javascript) (0) | 2022.09.09 |