본문 바로가기
SWEA

[SWEA] 13038. 교환학생 D3 JAVA (자바) 풀이

by Poorm 푸름 2024. 5. 12.

문제 13038번 (브루트포스)

 

교환학생들을 위한 수업은 특정 요일에만 진행된다 ( a1 ~ a7 )

 

  • 수업 미진행 = 0 / 수업 진행 = 1
  • 일요일 = a1 / 월요일 = a2 / 토요일 = a7
  • 수업이 어떠한 요일에도 열리지 않는 경우는 없다.

교환학생으로 n일 동안 수업을 들으려고 한다. 최소 일수를 출력하라

 

 

[입력]


: 첫 번째 줄에 테스트 케이스의 수

: 각 테스트케이스의 첫 번째 줄에는 첫 번째 줄에 정수 n (1≤ n ≤105)

  그 다음 줄에는  7개의 정수 a1, a2, …, a7 


 
[출력]


 : "#테스트케이스 정답" 출력

 

 

 

 [과정]

 

 탐색하자 → 브루트포스 / dfs → 조건이 있어서 다시 되돌아 간다 → 백트래킹

 

 ※ 과정
 

  •  시작 요일을 바꿔가며 가장 최소일 수인 min 값을 출력한다
    • 다만 수업이 있는 날부터 일 수를 체크하기 시작한다
    • arr = 1이 되면 그때부터 day++
    • start는 시작 요일을 구분하기 위해 만든 것 

 

 

 [코드]

import java.util.*;
import java.io.*;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T= Integer.parseInt(br.readLine());
        for(int t = 1; t <= T; t++)
        {  
            int N = Integer.parseInt(br.readLine());
            int arr[] = new int [7];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int i =0; i<7; i++){
                arr[i]=Integer.parseInt(st.nextToken());
            }
             
            int min = Integer.MAX_VALUE;
             
            for(int i =0; i<7; i++){
                if(arr[i]==0){
                    continue;
                }
                int start = i;
                int day = 0;
                int count = 0;
                   
                while(count <N){
                    if(arr[start%7] == 1){
                        count++;
                    }
                    day++;
                    start++;
                }
                min= Math.min(min, day);
            }
             
            System.out.println("#"+t+" "+min);
        }
    }
}

 

 

 [해설]
     

 :  for(int t = 1; t <= T; t++)

        { 

            int N = Integer.parseInt(br.readLine());  들어야하는 수업횟수

            int arr[] = new int [7];  일주일

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

            for(int i =0; i<7; i++){

                arr[i]=Integer.parseInt(st.nextToken());  수업체크

            }

             

            int min = Integer.MAX_VALUE;  초기화

             

            for(int i =0; i<7; i++){  7일 동안 어디서부터 시작할 지 정하기

                if(arr[i]==0){  수업이 없을 경우 넘어간다

                    continue;

                }

                int start = i;  요일 기록 (1이 되는 순간 호출할 것)

                int day = 0;  일수 체크

                int count = 0;  수업횟수 체크

                   

                while(count <N){  수업횟수 채워지면 종료

                    if(arr[start%7] == 1){  수업이 있는 날부터 시작

                        count++;  카운트

                    }

                    day++;  지금부터 일수 체크 시작

                    start++;  다음 요일로 옮기기

                }

                min= Math.min(min, day);  그동안 저장한 일수 최솟값 출력

            }

             

            System.out.println("#"+t+" "+min);

        }

 

 


  

 

 

 

 

이제 풀어보러 갈께요 :)

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXxNn6GaPW4DFASZ

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *