문제 : boj17554
필요 알고리즘 개념
- 시뮬레이션 (구현)
- 주어진 대로 구현만 할 줄 알면 풀 수 있다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
영어 독해 문제이다. 영어를 잘 해석해서 그대로 구현만 해주면 되는 시뮬레이션 문제이다. 로직은 아래와 같다.
1. 크기 N을 입력받아 배열을 만들고 불빛을 모두 켠 상태로 초기화한다(boolean[]으로 하던지 int[] 로 하던지 뭘로 하던 상관 없다. 켠걸 뭘로 표현할지도 알아서 정하면 된다. false를 켠걸로해도 전혀 상관없다.)
2. k개의 x를 입력받는다. 각 x값마다 '3'을 진행한다.
3. x, 2x, 3x, ..(N이하 일때까지) 번 불빛이 켜져있다면 끄고, 꺼져있다면 켜준다. 그리고 꺼져있는 불빛의 수를 센다. 이걸 cnt라고 하겠다.
4. k개의 x에 대해 '2'와 '3'을 진행하면서 가장 큰 cnt 값을 출력해준다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1<<17);
int n = Integer.parseInt(br.readLine());
int k = Integer.parseInt(br.readLine());
boolean[] arr = new boolean[n+1];
Arrays.fill(arr, true);
int answer = 0;
while (k-->0) {
int base = Integer.parseInt(br.readLine());
int cur = 0;
while ((cur+=base) <= n) arr[cur]=!arr[cur];
int cnt = 0;
for (int i = 1; i <= n; i++) if (!arr[i]) cnt++;
if (answer<cnt) answer=cnt;
}
System.out.println(answer);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 5214 - 환승 (java) (0) | 2022.08.30 |
---|---|
[자바] 백준 1244 - 스위치 켜고 끄기 (java) (0) | 2022.08.30 |
[자바] 백준 1343 - 폴리오미노 (java) (0) | 2022.08.30 |
[자바] 백준 23757 - 아이들과 선물 상자 (java) (0) | 2022.08.30 |
[자바] 백준 2548 - 대표 자연수 (java) (0) | 2022.08.30 |
댓글