🏆 문제 정보
난이도 : 중하
문제 유형 : 시물레이션 ( 구현 )
1244번
https://www.acmicpc.net/problem/1244
📌 문제
남학생 여학생 다르게 동작
남학생 -> 자기가 받은 수의 배수들 on off 반대
여학생 -> 받은 수를 대칭점으로 양쪽이 대칭이 되는 최대 구간을 찾아서 해당 스위치의 상태를 모두 바꾼다. ( 대칭점도 포함 )
스위치의 마지막 상태 출력
20개가 넘는다면 21번째부터는 둘 째줄 맨 앞
(20개씩출력)
남학생 -> 그냥 반대로 바꾸기
여학생 -> 구간찾기
항상 홀수
Index = 0
While ( target + index < length && target - index >=0 && check(index) )
Index ++
For <- taget-index <= I <= target + index:
switch(i)
📌 생각
1. 들어오는 input값을 ENUM형태로 대문자로 선언해서 받으니까 가시적으로 되게 좋았다.
2. array나 전역적으로 사용될 수 있는 값은 static 으로 선언하자.
3. 어떤 일을 한다~ => 메소드로 뽑으면 확실히 코드가 깔끔해진다.
🔥 주의점
⚡️ 1. while문안의 변수
while(SWITCH_NUMBER+add <= arr.length-1 && SWITCH_NUMBER - add >0 && check(SWITCH_NUMBER,add)){
add+=1;
}
if(add>=1) add--;
예제에서, add가 2여야 하는데 3이 돼서 출력값이 달랐다. 이유가 뭐지? 하고 디버깅을 돌려봤는데
내가 원하는 add 값은 2지만, while문에서 add가 3이어야 ( false 여야 ) while문을 빠져나온다. 그래서 해당 값에서 -1을 해주어야 한다.
⚡️2. 배열의 시작값
해당 문제는 index의 시작값이 1부터이다. 그래서 0번부터 시작하면 문제가 헷갈려지므로, 0번에는 쓰레기 값을 넣고, 1~N 범위의 배열을 쓰는게 좋다.
📌 코드
package in_class.hw_210802;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class SwitchTurnOff {
static int[] arr;
public static void main(String[] args) throws FileNotFoundException {
// System.setIn(new FileInputStream("in_class/hw_210802/input.txt"));
Scanner sc = new Scanner(System.in);
int SWITCH_NUMS = sc.nextInt();
arr = new int[SWITCH_NUMS+1];
for(int i=1;i<=SWITCH_NUMS;i++){
arr[i] = sc.nextInt();
}
int PEOPLE_NUMS = sc.nextInt();
for(int T=0;T<PEOPLE_NUMS;T++){
int GENDER = sc.nextInt();
int SWITCH_NUMBER = sc.nextInt();
int index = 1;
if( GENDER == 1){
while(index*SWITCH_NUMBER <= arr.length-1){
transfer(index*SWITCH_NUMBER);
index+=1;
}
}else if (GENDER == 2){
int add = 0;
while(SWITCH_NUMBER+add <= arr.length-1 && SWITCH_NUMBER - add >0 && check(SWITCH_NUMBER,add)){
add+=1;
}
if(add>=1) add--;
for(int i=SWITCH_NUMBER-add;i<=SWITCH_NUMBER+add;i++){
transfer(i);
}
}
}
int LINE_COUNT = 20;
for(int i=1;i<arr.length;i++){
if(LINE_COUNT<i){
System.out.println();
LINE_COUNT+=20;
}
System.out.print(arr[i] + " ");
}
}
private static boolean check(int SWITCH_NUMBER, int add) {
return arr[SWITCH_NUMBER+add] == arr[SWITCH_NUMBER-add];
}
private static void transfer(int target) {
if(arr[target] == 1){
arr[target] = 0;
}else{
arr[target] = 1;
}
}
}
'알고리즘 > 📌백준' 카테고리의 다른 글
백준: Z (0) | 2021.08.20 |
---|---|
백준: 배열돌리기 3 (0) | 2021.08.12 |
백준: 크로아티아 알파벳 (0) | 2021.08.12 |
백준 : 2493번 탑 (0) | 2021.08.05 |
백준 : 재귀함수가 뭔가요? (0) | 2021.08.02 |
댓글