프로젝트 매니징 (Java)
제출한 답 :
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] time = new int[N];
for(int i = 0; i < N; i++){
time[i] = Integer.parseInt(br.readLine());
}
br.close();
int total = T * 60 + M;
for(int i = 0; i < N; i++){
total += time[i];
if(total >= 24 * 60){
total %= 24 * 60;
}
}
int hour = total / 60;
int minute = total % 60;
System.out.println(hour + " " + minute);
}
}
단순 구현 문제라고 하던데... 왜 저는 이해가? 누가 코딩하는데 계산이 필요없다고 하신거죠?
코딩테스트는 수학입니다. ㅎㅎㅎ
이번에는 이렇게 풀었지만.. 다음에는 몇시간이 걸릴지?
물론 정말 암것도 모르는 상태라면 어렵겠지만 이번 문제 풀이도 상세해서 좋네요.
데이터 입력 부분에서 Intefer.parseInt(sc.nextLIne())의 문자열의 정수 변환이나, split()에 대한 설명은 좋네요.
정말 행렬과 그래프 형태의 입력을 알게 되면 어려움을 극복할 수 있을지는 의문이지만
문제 풀이 방법에 대해서 상세하게 설명되어서 있어서 코드를 쪼개서 복습하기에는 최고인 것 같습니다.
문제풀이에서는 저와는 다르게 배열로 입력받은 것을 [0]. [1]로 정확하게 변수에 넣어주었네요.
값을 명확하게 넣어주는게 더 좋은거겠죠?
특히나 시간 계산하기 부분은 정말 쉽게 잘 풀이해 주셨네요. 역시 코딩을 잘 하려면 글을 잘 쓰고 읽어야 한다더니
기능을 잘 정리해서 만들라고 하네요. 저도 기능을 쪼개서 만드는 연습을 더 해야 겠네요.
문제 풀이
필요한 개념
- 단순 구현
- 문자열
분석
PM이 된 플레이어는 현재 시간에서 N개의 기능 개발에 필요한 시간을 정리하고 있습니다. 기능 개발에 필요한 시간은 모두 분으로 제공되고 모든 기능이 완성되었을 때, 현재 시간이 몇 시인지 알아내면 되는 문제입니다.
문제 풀이
운동 중독 플레이어 문제와 같이 데이터를 입력을 받은 후에, 연산을 처리하면 됩니다. 자바에서 데이터를 입력 받는 부분은 항상 놓치기 쉬운 부분이 있으니 명확히 해주는 것이 좋습니다.
또 항상 입력되는 데이터가 문자열임을 기억한다면 어렵지 않게 이 문제를 해결할 수 있습니다.
데이터 입력
데이터를 입력 받기 위해서는 Scanner 모듈을 동일하게 사용하려고 해요.
이번 데이터 같은 경우에는 여러 개의 데이터를 입력 받아야 하고, 또 한 줄에 여러 개의 데이터가 공백을 두고 들어올 때 어떻게 입력을 받을지 고민해야 합니다.
Integer.parseInt() 함수는 들어온 문자열을 정수로 변환할 수 있어요. Integer.parseInt(sc.nextLine()) 이라고 한다면, 들어온 문자열을 정수로 변환하여 변수에 할당할 수 있죠.
또한 자바에서는 문자열을 특정 기준으로 나누어서, 배열로 변환해주는 split() 메소드도 있습니다. string.split(" ") 이라면, 공백을 기준으로 나누어서 배열로 반환해주죠.
알려드린 데이터 입력 방법만 안다면, 대부분의 데이터 입력은 어렵지 않게 받을 수 있어요. 나중에 행렬과 그래프 형태의 입력만 알게 된다면 코딩 테스트에서 입력으로 인한 어려움은 다 극복할 수 있죠.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 입력을 받기 위해 Scanner 객체 생성
// N 입력 받기
int N = Integer.parseInt(sc.nextLine());
// 현재 시간과 분 입력 받기
String[] time = sc.nextLine().split(" ");
int currentHour = Integer.parseInt(time[0]);
int currentMinute = Integer.parseInt(time[1]);
for (int i = 0; i < N; i++) {
int costMinute = Integer.parseInt(sc.nextLine());
}
}
}
시간 계산하기
시간의 개념을 잡아봅시다. 100분이라면 1시간 40분입니다. 만약에 1,000분은 어떻게 될까요? 16시간 40분 입니다.
물론 필요한 기능이 1개면, 굳이 계산할 필요가 없지만 필요한 기능은 N개입니다.
즉 주어지는 N개의 기능에 대해서 시간으로 변환을 해준 뒤, 현재 시간에 더하면 됩니다.
이때, 24시간을 넘어 간다면, 다시 0시로 돌아가면 됩니다.
이때 우리는 이런 논리를 고민해볼 수 있어요. 분은 항상 60분까지만 넘어간다면, 1시간이 된다는 점이에요. 즉 59분에서 2분은 더한 결과가 1분이 되어야 한다는 점이죠. 시간도 동일하게 23시간에서 1시간이 추가되면 0시가 되는 것과 같은 논리입니다.
이렇게 우리가 만들어야 하는 기능을 정리한 뒤, 문제를 풀어나가면 더 좋습니다.
- 분은 분끼리 더한 후, 60으로 나눈 나머지가 현재 분이 됩니다.
- 시는 분을 시로 나눈 뒤, 시끼리 더한 후 24로 나눈 나머지가 현재 시가 됩니다.
// 현재 분에서, 비용 분만큼 더한 후, 60으로 나눈 나머지가 결과 분이다.
int tempMinute = currentMinute + costMinute;
int resultMinute = tempMinute % 60;
// 현재 시에서, 비용 분읠 60으로 나는 몫만큼 더한 후, 24로 나눈 나머지가 결과 시이다.
int resultHour = (currentHour + tempMinute / 60) % 24;
즉, 이 계산법을 N개의 기능에 모두 적용하면 해결이 되는 문제입니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 입력을 받기 위해 Scanner 객체 생성
// N 입력 받기
int N = Integer.parseInt(sc.nextLine());
// 현재 시간과 분 입력 받기
String[] time = sc.nextLine().split(" ");
int currentHour = Integer.parseInt(time[0]);
int currentMinute = Integer.parseInt(time[1]);
// 각각의 분만큼 시간에 추가하기
for (int i = 0; i < N; i++) {
int costMinute = Integer.parseInt(sc.nextLine());
int tempMinute = currentMinute + costMinute;
int resultMinute = tempMinute % 60;
int resultHour = (currentHour + tempMinute / 60) % 24;
currentHour = resultHour;
currentMinute = resultMinute;
}
// 결과 출력
System.out.println(currentHour + " " + currentMinute);
}
}
팁으로 로컬타임을 사용해 보라고 하셨는데 이건 자바스크립트에 관련된 것 같네요ㅎㅎ
'문제풀기 > 구름톤 챌린지' 카테고리의 다른 글
구름톤 챌린지 2주 Day1 - 이진수 정렬 (0) | 2023.08.22 |
---|---|
구름톤 챌린지 1주 Day5 - 이진수 정렬 (0) | 2023.08.20 |
구름톤 챌린지 1주 Day4 - 완벽한 햄버거 만들기 (0) | 2023.08.19 |
구름톤 챌린지 1주 Day3 - 합 계산기 (0) | 2023.08.18 |
구름톤 챌린지 1주 Day1 - 운동 중독 플레이어 (0) | 2023.08.16 |