새소식

Algorithm/BOJ

(JAVA) [BOJ]백준 1244번, 스위치 켜고 끄기

  • -
728x90

https://www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

1244, 스위치 켜고 끄기

[ 난이도 : 실버 4 ]

이번 문제는 구현 문제이다.

 

쉬운 문제인데, 다른 부분은 다 쉽게 해결했는데 배수 구하는 부분을 잘못생각해서 이상하게 구현하여 고생을 좀 했다.

부디 같은 실수를 하는 사람이 없길 바란다 ..

Process

input

: 스위치의 개수, 스위치 여부와 학생 수를 차례로 받아준다.

이번 문제에서는 스위치를 스위칭 해야 하기 때문에 change 라는 배열을 생성해주었다.

change[0] = 1, change[1] = 0 을 사용하여 쉽게 값을 바꾸려는 의도이다.

static int N, num;
static int[] arr, change;

static void input() 
{
   N = scan.nextInt();
   arr = new int[N+1];
   for(int i=1; i<=N; i++) arr[i] = scan.nextInt();
   num = scan.nextInt();

   change = new int[2];
   change[0] = 1; change[1] = 0;
}

 

구현

: if 말고 switch를 통해 구현하였다. 학생 수만큼 입력을 받아주고 성별에 맞게 스위치 해준다.

남학생의 경우엔 배수의 스위치들을 모두 바꿔줘야 한다. 

여학생의 경우엔 해당 번호의 스위치는 무조건 바꾸고, 하나씩 넓혀가며 양 옆이 대칭이면 바꿔주는 로직이다.

여기서 또 주의해야 할 사항은 21번째에는 줄 바꿈을 해주면 된다.

for 문을 돌려가며 20의 배수에선 \n 으로 줄바꿈을 진행해주면 된다.

static void pro() 
    {   
        int gender, where;
        while(num-- >0)
        {
            gender = scan.nextInt(); where = scan.nextInt();
            switch(gender)
            {
                // 남학생
                case 1 :
                for(int j=1; j<=N; j++)
                {
                    int db = j*where;
                    if(db>N) break;
                    arr[db] = change[arr[db]];
                }
                break;

                // 여학생
                case 2 :
                    arr[where] = change[arr[where]];
                    int index = 1;
                    while(where-index > 0 && where+index <= N)
                    {
                        if(arr[where-index] != arr[where+index]) break;

                        arr[where-index] = change[arr[where-index]];
                        arr[where+index] = change[arr[where+index]];
                        index++;
                    }
                break;
            }
        }
        for(int i=1; i<=N; i++)
        {
            sb.append(arr[i]+" ");
            if(i%20 == 0) sb.append("\n");
        }
        
        System.out.println(sb);
	}

전체 코드

static int N, num;
static int[] arr, change;

static void input() 
{
   N = scan.nextInt();
   arr = new int[N+1];
   for(int i=1; i<=N; i++) arr[i] = scan.nextInt();
   num = scan.nextInt();

   change = new int[2];
   change[0] = 1; change[1] = 0;
}

static void pro() 
{   
    int gender, where;
    while(num-- >0)
    {
        gender = scan.nextInt(); where = scan.nextInt();
        switch(gender)
        {
            // 남학생
            case 1 :
            for(int j=1; j<=N; j++)
            {
                int db = j*where;
                if(db>N) break;
                arr[db] = change[arr[db]];
            }
            break;

            // 여학생
            case 2 :
                arr[where] = change[arr[where]];
                int index = 1;
                while(where-index > 0 && where+index <= N)
                {
                    if(arr[where-index] != arr[where+index]) break;

                    arr[where-index] = change[arr[where-index]];
                    arr[where+index] = change[arr[where+index]];
                    index++;
                }
            break;
        }
    }
    for(int i=1; i<=N; i++)
    {
        sb.append(arr[i]+" ");
        if(i%20 == 0) sb.append("\n");
    }

    System.out.println(sb);
}

 

문제만 잘 읽으면 전혀 어려운 문제가 아니기 때문에 필자와 같은 실수를 반복하지 않았으면 좋겠다.

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.