Skip to content

Commit dac2eb4

Browse files
[solved]
solved with two pointer
1 parent 9d85766 commit dac2eb4

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

baekjoon/boj1244.java

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package toyproject.somedaybucket.myAlgo;
2+
3+
4+
import java.util.Scanner;
5+
6+
class Switch{
7+
static int[] switchArr;
8+
static int start_pointer;
9+
static int end_pointer;
10+
static void man(int switchNum, int size){
11+
for(int i = switchNum; i <= size; i++){
12+
// 남학생의 경우, 받은 번호부터 사이즈까지 나누어 떨어지는 수(배수)라면 스위치를 반대로 놓도록 하였다.
13+
if((i % switchNum == 0)){
14+
switchArr[i] = (switchArr[i] == 1) ? 0 : 1;
15+
}
16+
}
17+
}
18+
19+
static void women(int switchNum, int size){
20+
// 투 포인터 알고리즘, 두 점의 위치를 기억
21+
/*
22+
* 여학생의 경우, 처음 위치가 들어왔을 때 대칭적으로 뻗어나가면서 비교해야 하기에 투포인터를 사용하여 앞 뒤를 비교할 수 있도록 하였다.
23+
* 만약 인덱스의 범위를 벗어나거나, 값이 다를 경우 리턴하여 연산을 끝낼 수 있도록 하였다.
24+
*
25+
* */
26+
switchArr[switchNum] = (switchArr[switchNum] == 1) ? 0 : 1;
27+
start_pointer = switchNum-1;
28+
end_pointer = switchNum+1;
29+
if(!checkPossibles(start_pointer, end_pointer, size)){
30+
return;
31+
}
32+
while (true){
33+
if(!checkPossibles(start_pointer, end_pointer, size)){
34+
return;
35+
}
36+
if (switchArr[start_pointer] == switchArr[end_pointer]){
37+
switchArr[start_pointer] = (switchArr[start_pointer] == 1) ? 0 : 1;
38+
switchArr[end_pointer] = (switchArr[end_pointer] == 1) ? 0 : 1;
39+
} else {
40+
return;
41+
}
42+
43+
start_pointer--;
44+
end_pointer++;
45+
46+
}
47+
}
48+
49+
static boolean checkPossibles(int i, int j, int size){
50+
// 왼쪽으로 가는 포인터가 0에 다다르거나, -> 1번 인덱스부터 이용하기 위함
51+
// 오른쪽으로 가는 포인터가 끝 사이즈를 넘어가게 되면 false 리턴!
52+
if (i <= 0 || j > size){
53+
return false;
54+
}
55+
return true;
56+
}
57+
}
58+
59+
public class boj1244 {
60+
public static void main(String[] args) {
61+
Scanner sc = new Scanner(System.in);
62+
int n = sc.nextInt();
63+
Switch.switchArr = new int[101];
64+
sc.nextLine(); // nextInt() -> 개행 문자 전까지 처리하기 때문에 개행 문자를 없애주기 위하여 사용!
65+
String s = sc.nextLine();
66+
67+
s = s.replace(" ", ""); // 1 아니면 0으로 이루어져 있기 때문에 공백을 없앰.
68+
for(int i = 1; i<=s.length(); i++){
69+
Switch.switchArr[i] = s.charAt(i-1) - '0'; // 인덱스로 참조했을 떄 '0' 만큼 빼서 int 형으로 대입할 수 있도록 함
70+
}
71+
72+
int t = sc.nextInt();
73+
sc.nextLine();
74+
for(int i = 0; i<t; i++){
75+
s = sc.nextLine();
76+
// 이 아래 두 줄은 10을 넘어갈 수도 있기 때문에 공백으로 자른 후 Integer wrapper class의 parseInt() 메서드로 변환해줌
77+
int gender = Integer.parseInt(s.split(" ")[0]);
78+
int switch_num = Integer.parseInt(s.split(" ")[1]);
79+
if (gender == 1){
80+
Switch.man(switch_num, n);
81+
}
82+
else if(gender == 2){
83+
Switch.women(switch_num, n);
84+
}
85+
}
86+
87+
for(int i = 1; i<=n; i++){
88+
if (i % 20 == 1 && i > 1){ // 첫 번째 줄 말고, 21, 41, ...번째 줄 등 20줄마다 줄바꿈을 해주기 위한 식
89+
System.out.println();
90+
}
91+
System.out.print(Switch.switchArr[i] + " ");
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)