백준 1244 자바

손찬호·2024년 9월 9일
0

알고리즘

목록 보기
90/91

풀이 아이디어

남학생의 경우 주어진 숫자의 배수에 해당하는 인덱스의 상태값을 바꿔주고
여학생의 경우 크게 2가지를 체크해야했는데
1. 주어진 수의 좌우 인덱스를 left, right라고 할 때
이 두 변수가 가능한 범위에 있는지(1<=left<right<=n1<=left<right<=n)
2. left,right 인덱스의 상태값이 같은지 다른지 확인하는데
같은 경우 left는 -1, right는 +1해서 다음 범위도 대칭인지 확인한다.
이때 아닌 경우 종료하고 바로 이전 인덱스를 기준으로 해당하는 범위의 상태값을 변환한다.

배운 점

1->0, 0->1

두 수간에 값을 불타입 변수처럼 상태가 변하게 하는 걸
switches[num] = 1-switches[num];로 표현했다.

처음에는 배열 선언을 아예 boolean으로 선언하려고 했지만
출력값이 정수형태로 저장해놔야 편하기 때문에 int타입 배열로 선언하였다.

ArrayIndexError

예제 입출력도 통과하고 정답이라고 생각한 코드를 제출했는데
ArrayIndexError가 발생했다. 이 코드에서 사용한 인덱스는
int[] switches뿐이었다.
left,right값을 바꾸고 switches배열의 해당 인덱스값을 불러올 때
문제가 발생한다고 생각해서 left,right를 초기화하거나 값이 변한 경우
left,right가 범위를 벗어나는지를 확인해줘서 해결했다.

풀이 코드

import java.io.*;
import java.util.*;

// 배운 거 
// 0->1, 1->0 반전 주는 법 : 1-switches[j]
// 범위 벗어나는지 미리 확인 : if(left<1 | right>n)


public class _1244 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // 남학생: 자기가 받은 수의 배수 
        // 여학생: 자기가 받은 수를 중심으로 대칭 

        int n = Integer.parseInt(br.readLine()); // 스위치 개수
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] switches = new int[n+1];
        for(int i=1; i<=n; i++){
            switches[i] = Integer.parseInt(st.nextToken());
        }

        int students = Integer.parseInt(br.readLine()); // 학생 수
        for(int i=0; i<students; i++){
            st = new StringTokenizer(br.readLine());
            int gender = Integer.parseInt(st.nextToken()); // 1: 남학생, 2: 여학생
            int num = Integer.parseInt(st.nextToken()); // 학생이 받은 수

            // 남학생: 받은 수의 배수에 해당하는 숫자의 상태를 반전
            if(gender==1){
                for(int j=num; j<=n; j+=num){ // 배수만큼 증가
                    switches[j] = 1-switches[j]; // 0->1, 1->0
                }
            }
            // 여학생: 받은 수의 대칭이 유지되는 최대의 범위만큼 상태를 반전
            else if(gender==2){
                int left = num-1;
                int right = num+1;

                // 범위를 벗어나면 받은 숫자만 반전
                if(left<1 | right>n){
                    switches[num] = 1-switches[num];
                }
                // 좌우가 다른 경우
                else if(switches[left]!=switches[right]){
                    switches[num] = 1-switches[num];
                }
                // 좌우가 같은 경우 
                else{
                    // 좌우 대칭이 유지될 때까지 탐색
                    while(switches[left]==switches[right]){
                        left--;
                        right++;
                        // 범위를 벗어나면 종료
                        if(left<1 | right>n){
                            break;
                        }
                    }
                    for(int j=left+1;j<=right-1;j++){
                        switches[j] = 1-switches[j];
                    }
                }
            }
        }

        for(int i=1; i<=n; i++){
            bw.write(switches[i]+" ");
            if(i%20==0){
                bw.write("\n");
            }
        }

        bw.flush();
        bw.close();
        br.close();
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보