삽질도사

[백준] 스위치 켜고 끄기 1244 자바 본문

백준

[백준] 스위치 켜고 끄기 1244 자바

전성진블로그 2021. 3. 12. 17:43

논리력을 크게 요구하지 않는 쉬운 문제였습니다.

하지만 인덱스와 관련된 문법에 에러가 발생하기 또한 쉬운 문제였습니다. (라임오지고)

그렇기때문에 쉬운 로직에도 불구하고 난이도가 실4정도로 잡혀있는 것 같습니다. (심지어 정답률 20%)

 

저 또한 쉽게 생각하고 대충 짰다가 엄청틀리고 뭐틀렸는지 몰라서 굉장히 헤맸습니다.

여자로직에서 while문에 인덱스 범위를 지정하면서 상당히 헷갈리기 시작하면서(?) 여러번 고쳐썼습니다. 

 

전체적으로 봤을 때,

 

while문에 진입하기전에 범위를 늘리고 ->

while(true){

 

늘린 범위가 맞는지 확인 ->

값이 같은지 확인 ->

범위 늘림

 

}

 

벗어나면 범위를 좁혀줌->

범위내에 값을 변경

 

함으로써 문제없이 구현했습니다.

 

while문을 벗어나는 조건이 범위가 넓거나, 값이 안맞아서 다시 범위를 좁혀주어야만 하는 조건임으로 나오면 다시

좁혀주었습니다.

 

그리고 제가 또 실수한게 코드에서 주석처리한 것처럼 

int left = num--;

int right = num++; 라고 적는 엄청난 실수를..

저러면 num=3일 떄,

left에는 3찍히고 , num = 2가 되고

right에는 2가 찍히고, num = 3이 됩니다...

 

솔브하다보면 한번 쯤하는 실수인데, 한번 경험했으면 어지간해서는 다시는 경험하지 않는게 좋습니다.

 구현문제나 그래프탐색에서 습관적으로 생각없이 코딩하면 저렇게 되오니, 여러분은 저를 참고해서 부디 조심하시길 바랍니다 :)

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 스위치켜고끄기 {

	static int bulb, students;
	static int[] arr;

	private static void change(int gender, int num) {

		if (gender == 1) {

			for (int x = num; x <= bulb; x += num) {
				if (arr[x] == 1)
					arr[x] = 0;
				else
					arr[x] = 1;
			}
		}

		if (gender == 2) {

			int left = num-1; // num--;
			int right = num+1; //num++; 라고 적었다가 크게 당했음 하기 쉬운 실수이니 주의하자
			
			while(true) {
				if((left)<1 || (right)> bulb) 
					break;
				if(arr[left] != arr[right])
					break;
				left--;
				right++;
			}
			
			left++;
			right--;
			
			for(int x= left; x<=right; x++) {
				if (arr[x] == 1)
					arr[x] = 0;
				else
					arr[x] = 1;
			}

		}
	}

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		bulb = Integer.parseInt(st.nextToken());
		arr = new int[101];

		st = new StringTokenizer(br.readLine());

		for (int x = 1; x <= bulb; x++) {
			arr[x] = Integer.parseInt(st.nextToken());
		}

		st = new StringTokenizer(br.readLine());
		students = Integer.parseInt(st.nextToken());

		for (int x = 0; x < students; x++) {
			st = new StringTokenizer(br.readLine());

			int gender = Integer.parseInt(st.nextToken());
			int num = Integer.parseInt(st.nextToken());

			change(gender, num);
		}
		
		for (int x = 1; x <= bulb; x++) {
			System.out.print(arr[x] + " ");
			if(x%20 == 0) System.out.println();
		}

	}

}

'백준' 카테고리의 다른 글

[백준] 행복 유치원 13164 자바  (0) 2021.03.12
[백준] 파일정리 20291 자바  (0) 2021.03.12
[백준] 빙고 2578 자바  (0) 2021.03.09
[백준] 택배 8980 자바  (0) 2021.03.09
[백준] 오리 12933 자바  (0) 2021.03.09