[SWEA] 13038 - 교환학생 (Java)

민영·2023년 5월 15일
0
post-thumbnail

Problem

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&problemLevel=2&problemLevel=3&contestProbId=AXxNn6GaPW4DFASZ&categoryId=AXxNn6GaPW4DFASZ&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=2


Approach & Logic

1) 처음 구현했던 코드

수업있는 날을 만나면 그때부터 Day Count를 +1 한다.
수업있는 날을 만날때마다 Class Count를 -1 한다.

대충 아래와 같은 코드였다..

int dayCount = 0; 
Boolean start = false; //개강했는지

while(classCount!=0) {
	for(int i=0; i<7; i++) {
    	//수업을 들었다면
    	if(calender[i]==1) { 
        	start = true;
			classCount--;
		}
        
        //개강한 상태라면
		if(start == true) { 
			dayCount++;
		}
        
        //수업을 다 들었다면
		if(classCount==0) { 
			break;
		}
	}
}

위에 코드로 제출하니까 100개중에 75개만 맞았다..
문제의 댓글을 보니까 개강일에 따라 최소 일수가 다르기 때문에 수업이 있는 각 요일을 개강일로 했을 때 일수를 구하고 최소 일수를 출력해야 된다는 것이었다.

이게 무슨 말이냐면 처음 구현했던 코드로는
0 1 0 0 0 1 1 라는 스케줄에서 두번 수업을 들어야 된다면 정답이 5로 출력된다. 하지만, 최소 일수는 2일이다.

2) 뜯어고친 두번째 코드

// 첫 개강일마다의 최소 일수 계산
int min = Integer.MAX_VALUE;
for(int i=0; i<7; i++) {
	if(calender[i]==1) {
    	//i요일을 개강일로 할때 최소 일수 구하기
      	int start = i;
		int cnt=0;
        
		while(true) {
        	//수업듣기
			if(calender[start%7]==1) 
            	cnt++;
			//일수 추가
			start++;
            
			//수업을 다 들었을때
			if(cnt==classNum) {
            	min = Math.min(min, start -i);
                break;
			}
		}
	}	
}

Code

import java.util.Scanner;
import java.io.FileInputStream;

class Solution
{
	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);
		int testCase = Integer.parseInt(sc.next());
		
		for(int t=1; t<=testCase; t++) {
			
			//들어야 되는 수업 수
			int classNum = Integer.parseInt(sc.next());
			
			//일주일 수업 일정
			int[] calender = new int[7] ;
			for(int i=0; i<7; i++) {
				calender[i] = sc.nextInt();
			}
			
			// 첫 개강일마다의 최소 일수 계산
			int min = Integer.MAX_VALUE;
			for(int i=0; i<7; i++) {
				if(calender[i]==1) {
					//i요일을 개강일로 할때 최소 일수 구하기
					int start = i;
					int cnt=0;
                    
					while(true) {
						//수업듣기
						if(calender[start%7]==1) 
							cnt++;
						//일수 추가
						start++;
                        
						//수업을 다 들었을때
						if(cnt==classNum) {
							min = Math.min(min, start -i);
							break;
						}
					}
				}
			}
			
			//정답 출력
			System.out.println("#"+t+" "+min);
		}
		
		sc.close();
	}
}
profile
그날의 기록

0개의 댓글