📖 문제
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
💡 풀이 방식
• 구현, 시뮬레이션
👨 남자인 경우
- 스위치 배열 switches 에서 인덱스가 입력받은 수의 배수인 칸의 상태를 변경한다.
👩 여자인 경우
- 현재 칸은 무조건 상태를 변경한다.
- 현재 칸의 왼쪽 위치 l과 현재 칸의 오른쪽 위치 r을 잡는다. (투 포인터)
- l과 r이 배열의 크기를 벗어나지 않는 동안 반복문을 수행한다. (while문 사용)
- 만약 좌우 두 칸이 대칭인 경우 (
swithces[l] == switches[r]
), 좌우 두 칸을 모두 상태 변경하고, l은 왼쪽으로 한 칸, r은 오른쪽으로 한 칸 이동시킨다. - 좌우 대칭이 아닌 경우, 루프를 종료한다.
- 만약 좌우 두 칸이 대칭인 경우 (
- 스위치 배열을 출력한다.
🔺 코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
import java.util.*;
import java.io.*;
public class Main {
static int N, M;
static int[] switches;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
switches = new int[N + 1];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 1 ; i <= N ; i++) {
switches[i] = Integer.parseInt(st.nextToken());
}
M = Integer.parseInt(br.readLine());
while(M --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int gender = Integer.parseInt(st.nextToken());
int pos = Integer.parseInt(st.nextToken());
solve(gender, pos);
}
print();
}
private static void solve(int gender, int pos) {
if(gender == 1) { // 남자인 경우
for(int i = pos ; i <= N ; i += pos) { // 받은 수의 배수인 경우 상태 변경
switches[i] = switches[i] == 0 ? 1 : 0;
}
}
else { // 여자인 경우
switches[pos] = switches[pos] == 0 ? 1 : 0; // 🔔 현재 칸은 무조건 상태 변경
int l = pos - 1; // 현재 칸의 왼쪽 위치
int r = pos + 1; // 현재 칸의 오른쪽 위치
while(1 <= l && r <= N && l <= r) {
if(switches[l] == switches[r]) { // 좌우 두 칸의 값이 대칭인 경우
switches[l] = switches[l] == 0 ? 1 : 0;
switches[r] = switches[r] == 0 ? 1 : 0;
l--;
r++;
}
else { // 좌우 값 대칭이 아닌 경우, 종료
break;
}
}
}
}
// 출력 메소드
private static void print() {
StringBuilder sb = new StringBuilder();
for(int i = 1 ; i <= N ; i++) {
sb.append(switches[i] + " ");
if(i % 20 == 0) { // 한 줄에 20개씩 출력용
sb.append("\n");
}
}
System.out.println(sb);
}
}
|
cs |
➕ 다른 풀이 방식
뭔가 다들 그냥 양 옆으로 확장하는 크기 변수 cnt만큼 대칭인지 확인하고 상태 변경하셨다.
백준#1244 스위치 켜고 끄기 (JAVA)
https://www.acmicpc.net/problem/1244 1244번: 스위치 켜고 끄기 첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1,
4pace9ray.tistory.com
[백준 1244] 스위치 켜고 끄기(Java)
https://www.acmicpc.net/problem/1244 1244번: 스위치 켜고 끄기 첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1,
wiselog.tistory.com
💦 어려웠던 점
- 양 옆 범위 확장하고 마지막으로 한 번에 left부터 right 범위까지 상태 변경하려고 했는데 그게 잘 적용이 안 되었다.
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 240625 |
(+240625 2회독 14600KB 156ms)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
import java.util.*;
import java.io.*;
public class Main {
static int N,M;
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine()); // 스위치 수
arr = new int[N+1];
// 스위치 상태
st = new StringTokenizer(br.readLine(), " ");
for(int i = 1 ; i <= N ; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
M = Integer.parseInt(br.readLine()); // 학생 수
while(M --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken()); // 성별 (1:남 , 2:여)
int y = Integer.parseInt(st.nextToken()); // 학생이 받은 수
solve(x, y);
}
print();
}
private static void solve(int x, int y) {
if(x == 1) { // 남자
for(int i = y ; i <= N ; i += y) {
arr[i] = (arr[i] == 0) ? 1 : 0;
}
}
else { // 여자
// 본인 뒤집기
arr[y] = (arr[y] == 0) ? 1 : 0;
// 양옆 처리
int l = y - 1;
int r = y + 1;
while(l >= 1 && r <= N && l <= r) {
if(arr[l] != arr[r])
break;
arr[l] = (arr[l] == 0) ? 1 : 0;
arr[r] = (arr[r] == 0) ? 1 : 0;
l--;
r++;
}
}
}
private static void print() {
StringBuilder sb = new StringBuilder();
for(int i = 1 ; i <= N ; i++) {
sb.append(arr[i] + " ");
if(i % 20 == 0) { // 한 줄에 20개씩 출력
sb.append("\n");
}
}
System.out.println(sb.toString());
}
}
|
cs |
(참고)
[백준] 1244. 스위치 켜고 끄기 (Java)
문제 : https://www.acmicpc.net/problem/1244 1244번: 스위치 켜고 끄기 첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으
hanyeop.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 17276번: 배열 돌리기 (0) | 2024.01.12 |
---|---|
[백준/JAVA] 17413번: 단어 뒤집기 2 (0) | 2024.01.12 |
[백준/JAVA] 1325번: 효율적인 해킹 (0) | 2024.01.04 |
[백준/JAVA] 17136번: 색종이 붙이기 (0) | 2024.01.02 |
[백준/JAVA] 22858번: 원상 복구 (small) (0) | 2023.12.31 |