728x90
반응형
2024.05.29기준 - 실버3
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 메모장에 적어 둔 밥을 사준다는 선배들의 약속 중 정민이가 최대 며칠 연속으로 밥을 얻어 먹을 수 있는지 알아내는 문제입니다.
저의 문제 접근은
- 메모를 저장할 커스텀 class를 생성한다.
- 선배의 이름과 메모를 저장할 Map를 선언한다.
- 약속에 필요한 금액과 선배가 들고 있는 금액을 비교하여 얻어 먹을 수 없으면 Map에서 제외한다.
- 얻어 먹을 수 있는 날짜를 계산하기 위한 boolean[week][day]를 선언한다.
- Map에는 얻어 먹을 수 있는 날짜만 있기 때문에 boolean[][]에 true로 저장한다.
- 연속된 true값을 계산하여 출력한다.
로 진행하게 되었습니다.
Map을 이용해 데이터를 적제하기 때문에 커스텀 class인 Memo에는 선배의 이름을 제외하여 생성하게 되었습니다.
그렇게 약속을 다 받아 적고 난 다음 선배가 들고 있는 돈과 약속에 필요한 돈을 계산해
Map에서 제외를 하냐 안하냐 를 결정했습니다.
boolean 함수를 선언할때 false로 선언되기 때문에 얻어 먹을 수 있는 날짜만 기록되어 있으면 충분하다고 생각을 했기 때문입니다.
메모장(map)에 적힌 날짜를 반복문을 통해 true로 변환해줍니다.
변환된 boolean[][] 함수에서 연속된 true의 개수를 계산해 max변수에 값을 저장해 출력을 해줬습니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
// 메모를 저장하기 위한 클래스
public static class Memo {
int week, day, price;
public Memo(int w, int d, int p) {
week = w;
day = d;
price = p;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // 기록의 수
StringTokenizer st;
Map<String, Memo> map = new LinkedHashMap<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
String s = st.nextToken(); // 선배의 이름
int w = Integer.parseInt(st.nextToken()); // 선배를 만나는 주차
int d = Integer.parseInt(st.nextToken()); // 선배를 만나는 요일
int p = Integer.parseInt(st.nextToken()); // 약속에 드는 비용
map.put(s, new Memo(w, d, p));
}
while (n-- > 0) {
st = new StringTokenizer(br.readLine());
String s = st.nextToken(); // 선배의 이름
int m = Integer.parseInt(st.nextToken()); // 선배가 소지한 돈
if (map.get(s).price > m) { // 선배가 살 수 없다면 삭제
map.remove(s);
}
}
boolean[][] visit = new boolean[11][7];
for (String s : map.keySet()) { // 얻어 먹을 수 있는 날짜는 true로 변경
visit[map.get(s).week][map.get(s).day] = true;
}
int max = 0;
int count = 0;
// 최대값 구하기
for (int i = 1; i < 11; i++) {
for (int j = 0; j < 7; j++) {
if (visit[i][j]) {
count++;
} else if (count != 0) {
max = Math.max(max, count);
count = 0;
}
}
}
// 마지막까지 0이 안나오면 max값을 계산을 안하기 때문에, 한번 더 계산
max = Math.max(max, count);
bw.write(Integer.toString(max));
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31872번 강의실 (0) | 2024.05.31 |
---|---|
BAEKJOON / 백준 - JAVA 31870번 버블버블 (0) | 2024.05.30 |
BAEKJOON / 백준 - JAVA 31866번 손가락 게임 (0) | 2024.05.27 |
BAEKJOON / 백준 - JAVA 11070번 피타고라스 기댓값 (0) | 2024.05.26 |
BAEKJOON / 백준 - JAVA 31798번 단원평가 (0) | 2024.05.24 |