Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Android
- java
- val
- 프로그래머스
- 시뮬레이션
- imeOptions
- 자바
- 백준
- 순수함수
- Parcelize
- Kotlin
- SWEA
- Parcelable
- 오르막수
- 약수 구하기
- EditText
- 최단경로
- BuildConfig
- BFS
- 완전탐색
- dfs
- 조합
- 지능형 기차2
- 백준 퇴사
- 스카이라인 쉬운거
- 순열
- EditorInfo
- 2501
- hilt
- 백준 14501
Archives
- Today
- Total
안드 공부를 해볼까?
[Java] 백준 스위치 켜고 끄기 본문
728x90
1. 문제분석
처음은 스위치의 개수와 정보를 주고 남학생과 여학생, 스위치의 위치가 주어진다.
남자는 쉽게 풀 수 있다. 만약 위치가 3이라면 3, 6, 9.. 이런식으로 스위치의 정보를 바꾼다.
반면 여자의 경우는 조금 생각을 해야한다.
테스트 케이스를 보자. 여자면서 3번 스위치가 주어졌다.
3번을 기준으로 왼쪽, 오른쪽 대칭을 확인한다. 만약 대칭이라면 변경한다.
또한 대칭이 아에 없다면 3번만 꺼주면 된다. 밑의 그림을 보고 확인하자.
그대로 구현해주면 되는 문제지만 필자는 계속 시간초과가 났다.
필자는 처음 구현할 때, 인덱스 범위만 맞는다면 while을 진행시켰다. 하지만 시간초과가 났다.
분명 정보도 많이 없을텐데 왜 시간초과가 날까 생각해 데이터를 조금 정제할 필요가 있다고 생각했다.
여기서 만약 대칭이 아니라면, 즉 exclusive or을 사용해서 break을 해주었다.
그러더니 바로 통과가 되었다.
2. 구현
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int size = Integer.parseInt(br.readLine());
boolean[] arr = new boolean[size + 1];
//데이터 넣어주기
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i <= size; i++) {
if (st.nextToken().equals("1")) {
arr[i] = true;
}
}
//학생별 전등 변화
int pSize = Integer.parseInt(br.readLine());
for (int i = 0; i < pSize; i++) {
st = new StringTokenizer(br.readLine());
int sex = Integer.parseInt(st.nextToken());
int pos = Integer.parseInt(st.nextToken());
//남자
if (sex == 1) {
for (int j = pos; j <= size; j += pos) {
arr[j] = !arr[j];
}
}
//여자
else {
int left = pos - 1;
int right = pos + 1;
arr[pos] = !arr[pos];
while (true) {
//인덱스 오류거나, 다르거나
if(left < 1 || right > size || arr[left] ^ arr[right]){
break;
}
else {
arr[left] = !arr[left];
arr[right] = !arr[right];
left--;
right++;
}
}
}
}
//출력은 20개씩 끊어서
for(int j = 1; j<=size; j++){
if(arr[j]){
System.out.print(1 + " ");
}
else{
System.out.print(0 + " ");
}
if(j % 20 == 0){
System.out.println();
}
}
}
}
배열 정보는 0, 1밖에 없기 때문에 boolean으로 구현했다.
남자는 쉬우니 넘어가고 여자의 경우는 left와 right로 점차 영역을 넓혀나갔다.
만약 인덱스를 넘어가거나, 대칭이 아니라면 break로 바로 나오게 구현했다.
3. 마무리
실버3의 문제였다. 이번도 문제를 잘 보지 않았다. 20개씩 출력인데...
또, 나름 실버네? 하면서 풀었는데 문제 출저가 초등학교 문제란다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ..
요즘 초등학생들은 공부 잘하나보다..
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Java] 백준 수열 (0) | 2022.08.20 |
---|---|
[Java] 백준 종이자르기 (0) | 2022.08.20 |
[Java] 백준 직사각형 네개의 합집합의 면적 구하기 (0) | 2022.08.20 |
[Java] 백준 기차가 어둠을 헤치고 은하수를 (0) | 2022.08.16 |
[Java] 백준 귀여운 라이언 (0) | 2022.08.16 |
Comments