https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PnnU6AOsDFAUq&categoryId=AV5PnnU6AOsDFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

풀이

  1. 월별로 일수를 배열에 미리 저장해둔다.
  2. 첫 번째 달 일수를 미리 합에 저장
  3. 두 번째 달부터 마지막 달까지의 합을 모두 합에 더하고
  4. 마지막 달 전체 일수에서 입력받은 일수를 빼준값을 다시 합에서 빼준다.

 

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

public class Solution {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		int[] date = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //월별 일수를 미리 저장
		
		for(int tc=1; tc<=T; tc++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int m1 = Integer.parseInt(st.nextToken())-1;
			int d1 = Integer.parseInt(st.nextToken());
			int m2 = Integer.parseInt(st.nextToken())-1;
			int d2 = Integer.parseInt(st.nextToken());
			
			
			int sum = date[m1]-d1+1; //첫 번째 달을 합에 미리 저장
            
            //두 번째 달부터 마지막 달까지 모두 합해준다.
			for(int i=m1+1; i<=m2; i++) {
				sum += date[i];
			}
            
            //마지막 달의 일수에서 입력받은 두 번째 일수를 빼준 값을 총 합에서 빼준다.
			sum -= date[m2]-d2;
            
			System.out.println("#"+tc+" "+sum);
		}
	}

}

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1945. 간단한 소인수분해  (0) 2019.05.14
[SWEA] 1946. 간단한 압축 풀기  (0) 2019.05.14
[SWEA] 1954. 달팽이 숫자  (0) 2019.05.14
[SWEA] 1959. 두 개의 숫자열  (0) 2019.05.14
[SWEA] 1961. 숫자 배열 회전  (0) 2019.05.14

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

방향 전환 문제 연습하기 좋은 문제 같다.

 

풀이

  1. 먼저 N이 1일 때는 2차원 배열을 만들지 못하므로 바로 1을 출력하도록 처리해주었다.
  2. 우 -> 하 -> 좌 -> 상 순서로 계속 움직일 것이므로 미리 순서에 맞게 dx, dy 배열을 저장.
  3. 처음 좌표는 (0,0) 방향은 dir=0 (우 방향)
  4. i부터 N*N까지 순차적으로 저장해준다.
  5. 범위를 벗어나거나 이동할 곳에 값이 이미 있는 경우마다 방향을 회전해준다.
    1. 좌표를 다시 원래대로 돌려준 후에
    2. 방향 전환하고
    3. 다시 전환한 방향으로 이동

 

import java.io.*;

public class Solution {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		int dx[] = {0,1,0,-1};
		int dy[] = {1,0,-1,0};
		for(int tc=1; tc<=T; tc++) {
			int N = Integer.parseInt(br.readLine());
			
            //N 이 1인 경우를 따로 처리
			if(N == 1) {
				System.out.println("#"+tc);
				System.out.println(1);
				continue;
			}
			int[][] arr = new int[N][N];
           
			int x = 0;
			int y = 0;
			int dir = 0; //처음 방향은 0(우 방향)
			
            
			for(int i=0; i<N*N; i++) {
				
				arr[x][y] = i+1;
				x += dx[dir];
				y += dy[dir];
                
                //범위를 벗어나는 경우 방향 전환
				if(x >= N || y >= N || x < 0 || y < 0) {
					//원래 위치로 돌려주고
                    x -= dx[dir];
					y -= dy[dir];
                    
                    //방향 전환 (0->1 우에서 하/ 1->2 하에서 좌/ 2->3 좌에서 상/ 3->0 상에서 우)
					dir = (dir+1)%4;
                    
                    //전환한 방향으로 이동
					x += dx[dir];
					y += dy[dir];
				}
				
                //이동할 곳에 값이 있는 경우 방향 전환
				if(arr[x][y] != 0) {
					x -= dx[dir];
					y -= dy[dir];
					dir = (dir+1)%4;
					x += dx[dir];
					y += dy[dir];
				}
				
			}
			
			System.out.println("#"+tc);
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					System.out.print(arr[i][j]+" ");
				}
				System.out.println();
			}
		}
	}

}

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1946. 간단한 압축 풀기  (0) 2019.05.14
[SWEA] 1948. 날짜 계산기  (0) 2019.05.14
[SWEA] 1959. 두 개의 숫자열  (0) 2019.05.14
[SWEA] 1961. 숫자 배열 회전  (0) 2019.05.14
[SWEA] 1974. 스도쿠 검증  (0) 2019.05.03

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpoFaAS4DFAUq&categoryId=AV5PpoFaAS4DFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

풀이

  1. N < M 인 경우 / N == M 인 경우 / N > M 인경우로 나눠서 풀었다.
  2. 자세한 설명은 코드에 추가했다.

 

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

public class Solution {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		

		for(int tc=1;tc<=T;tc++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int M = Integer.parseInt(st.nextToken());
			
			int[] a = new int[N];
			int[] b = new int[M];
			
			st = new StringTokenizer(br.readLine());
			for(int i=0; i<N; i++) {
				a[i] = Integer.parseInt(st.nextToken());
			}
			
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<M; j++) {
				b[j] = Integer.parseInt(st.nextToken());
			}
			
			int max = 0;
			int tmp = 0;
			if(N < M) {
				
				for(int j=0; j<=M-N; j++) { //인덱스가 M-N을 넘어가면 비교할 범위(N개)가 넘어가므로
					int k=j; //비교할 위치
					int sum = 0;
					for(int i=0; i<N; i++) { //N개만큼동안 a배열과 b배열의 값을 곱해준다.
						tmp = a[i] * b[k++]; //a배열값과 b배열값 곱해주기
						sum += tmp; //곱한 값을 계속 더해준다.
					}
					if(sum > max) max = sum; //최댓값을 저장
				}

			} else if(N == M) { //크기가 같은 경우에 최댓값의 경우는 한가지.
				for(int i=0; i<N; i++) {
					max += a[i]*b[i];
				}
			} else { // N이 더 큰 경우. M이 더 큰 경우와 반대로 해주면 된다.
				for(int j=0; j<=N-M; j++) {
					int k=j;
					int sum = 0;
					for(int i=0; i<M; i++) {
						tmp = a[k++] * b[i];
						sum += tmp;
					}
					if(sum > max) max = sum;
				}
			}
			
			System.out.println("#"+tc+" "+max);
		}
	}

}

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1948. 날짜 계산기  (0) 2019.05.14
[SWEA] 1954. 달팽이 숫자  (0) 2019.05.14
[SWEA] 1961. 숫자 배열 회전  (0) 2019.05.14
[SWEA] 1974. 스도쿠 검증  (0) 2019.05.03
[SWEA] 1970. 쉬운 거스름돈  (0) 2019.05.03

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-OKAVYDFAUq&categoryId=AV5Pq-OKAVYDFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

풀이

  1. 입력받은 배열을 처음에 90도 돌려서 새로운 배열에 저장해준다.
  2. 위에도 90도 돌린 배열을 다시 돌리면 180도가 되고 다시 이 배열을 돌리면 270도가 된다.
  3. 90도씩 회전하는 rotate함수
    1. 새로운 배열에 배열을 돌려서 저장한 후에 새로운 배열을 리턴한다.
    2. 90도를 돌리면 1행이 N열로, 2행이 N-1열로, ,,, , N행이 1열로 된다.
    3. 새로운 배열에서 N열부터 감소해가며 모든 열을 채워준다.
    4. 각 열에서는 1행부터 순서대로 채워준다.
import java.io.*;
import java.util.*;

public class Solution {
	static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		for(int tc=1; tc<=T; tc++) {
			N = Integer.parseInt(br.readLine());
			int[][] arr = new int[N][N];
			
			StringTokenizer st;
			for(int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine());
				for(int j=0; j<N; j++) {
					arr[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
            //기존의 배열을 90도 회전
			int[][] arr90 = rotate(arr);
            
            //90도 회전한 배열을 다시 90도 회전 == 180도 회전
			int[][] arr180 = rotate(arr90);
            
            //180도 회전한 배열을 다시 90도 회전 == 270도 회전
			int[][] arr270 = rotate(arr180);
						
                        
			System.out.println("#"+tc);
			for(int i=0; i<N; i++) {
            
            	//90도 회전 배열 출력
				for(int j=0; j<N; j++) {
					System.out.print(arr90[i][j]);
				}
				System.out.print(" ");
                
                //180도 회전 배열 출력
				for(int j=0; j<N; j++) {
					System.out.print(arr180[i][j]);
				}
				System.out.print(" ");
                
                //270도 회전 배열 출력
				for(int j=0; j<N; j++) {
					System.out.print(arr270[i][j]);
				}
				System.out.println();
			}
		}

	}
	
	
	//90도 회전시키는 함수
	static int[][] rotate(int[][] arr) {
    
		int[][] newarr = new int[N][N]; //새로운 배열에다 회전한 값을 넣어준다.
		int k = 0; //기존 배열의 행을 가르키는 index
        
		for(int j=N-1; j>=0; j--) {
			for(int i=0; i<N; i++) {
            	//새로운 배열에는 마지막 열(N-1)부터, 각 열에서는 첫 행(0)부터 채워준다.
                //기존 배열의 k행 i열값을 넣어준다. (0행0열부터 순차대로 넣어준다)
				newarr[i][j] = arr[k][i];
			}
			k++;
		}
		
		return newarr;
	}

}

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1954. 달팽이 숫자  (0) 2019.05.14
[SWEA] 1959. 두 개의 숫자열  (0) 2019.05.14
[SWEA] 1974. 스도쿠 검증  (0) 2019.05.03
[SWEA] 1970. 쉬운 거스름돈  (0) 2019.05.03
[SWEA] 1979. 어디에 단어가 들어갈 수 있을까  (0) 2019.05.02

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

 

풀이

    1. 가로, 세로, 3X3격자칸을 검사하는 함수를 각각 만들어주었다.
    2. 검사 중 하나라도 겹치는 숫자를 가지고 있다면 0을 출력하고 다음 테스트 케이스로 넘어간다.
    3. 각 check함수에서는 check 배열을 만들어서 해당 숫자칸이 이미 true이면 false를 리턴한다. 그렇지 않으면 check배열의 해당 인덱스 값을 true로 바꿔준다.
    4. 격자칸의 경우 각 격자칸의 시작점(0,0), (0,3), (0,6), (3,0), ,,, ,(6,6),(6,9) 에서 부터 시작하여 3X3칸을 검사하도록 했다.
import java.io.*;
import java.util.StringTokenizer;

public class Solution {

	static int[][] puzzle;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
        
		for(int tc=1; tc<=T; tc++) {
			puzzle = new int[9][9];
            
			for(int i=0; i<9; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				for(int j=0; j<9; j++) {
					puzzle[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
            
			boolean flag = true;
            //모든 가로를 검사한다.
			for(int i=0; i<9; i++) {
				if(!checkGaro(i)) {
                	//한줄이라도 false이면 검사를 멈춘다.
					System.out.println("#"+tc+" "+0);
					flag = false;
					break;
				}
			}
			if(!flag) continue; //다음 테스트 케이스 실행
			
            
            //모든 세로를 검사
			for(int j=0; j<9; j++) {
				if(!checkSero(j)) {
					System.out.println("#"+tc+" "+0);
					flag = false;
					break;
				}
			}
			if(!flag) continue; //다음 테스트 케이스 실행
			
            
            //모든 3X3 격자칸 검사
            //격자칸의 각 시작점에서부터 검사
			for(int i=0; i<=6; i+=3) { //3칸씩 점프 (다음 격자칸 이동을 위해)
				for(int j=0; j<=6; j+=3) {
					if(!checkNemo(i,j)) {
						System.out.println("#"+tc+" "+0);
						flag = false;
						break;
					}
				}
				if(!flag) break;
			}
			if(!flag) continue;
			
            
            //위에서 모두 검사를 통과했다면 1을 출력
			System.out.println("#"+tc+" "+1);
			
		}
	}
	
    
	static boolean checkGaro(int x) {
		boolean[] check = new boolean[9];
		for(int j=0; j<9; j++) { // x행에 대하여 모든 j열을 검사.
			if(check[puzzle[x][j]-1]) //이미 해당 숫자를 가지고 있다.
				return false;
			check[puzzle[x][j]-1] = true;
		}
		
		return true;
	}
	
    
	static boolean checkSero(int y) {
		boolean[] check = new boolean[9];
		for(int i=0; i<9; i++) { // y열에 대하여 모든 i행을 검사.
			if(check[puzzle[i][y]-1]) //이미 해당 숫자를 가지고 있다.
				return false;
			check[puzzle[i][y]-1] = true;
		}
		return true;
	}
	
    
	static boolean checkNemo(int x, int y) {
		boolean[] check = new boolean[9];
		int nx = x+3;
		int ny = y+3;
        //x행 y열에서 시작하는 3X3 칸을 검사.
		for(int i=x; i<nx; i++) {
			for(int j=y; j<ny; j++) {
				if(check[puzzle[i][j]-1]) //이미 해당 숫자를 가지고 있다.
					return false;
				check[puzzle[i][j]-1] = true;
			}
		}
		return true;
	}


}

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1959. 두 개의 숫자열  (0) 2019.05.14
[SWEA] 1961. 숫자 배열 회전  (0) 2019.05.14
[SWEA] 1970. 쉬운 거스름돈  (0) 2019.05.03
[SWEA] 1979. 어디에 단어가 들어갈 수 있을까  (0) 2019.05.02
[SWEA] 1976. 시각 덧셈  (0) 2019.05.02

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

 

SW Expert Academy

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

www.swexpertacademy.com

풀이

화폐단위를 미리 배열에 넣어두고 차례대로 나눠주며 count를 해줬다.

import java.io.*;


public class Solution {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		for(int tc=1; tc<=T; tc++) {
			int N = Integer.parseInt(br.readLine());
			
			int[] count = new int[8];
			int[] money = {50000, 10000, 5000, 1000, 500, 100, 50, 10};
			for(int i=0; i<8; i++) {
				if(N >= money[i]) { //돈이 화폐단위보다 같거나 클때만 나눠준다.
					int cnt = N/money[i];
					count[i] = cnt;
					N -= cnt*money[i];
				}
			}
			
			System.out.println("#"+tc);
			for(int i=0; i<8; i++) {
				System.out.print(count[i]+" ");
			}
			System.out.println();
		}
	}

}

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1961. 숫자 배열 회전  (0) 2019.05.14
[SWEA] 1974. 스도쿠 검증  (0) 2019.05.03
[SWEA] 1979. 어디에 단어가 들어갈 수 있을까  (0) 2019.05.02
[SWEA] 1976. 시각 덧셈  (0) 2019.05.02
[SWEA] 1983. 조교의 성적 매기기  (0) 2019.05.01

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

시뮬레이션 문제. D2 치고는 조금 생각해야 하는 문제였다. (앞에서 푼 시각 덧셈이랑 난이도 차이가 꽤 있다.)

 

풀이

  1. 입력을 모두 받은 후에 값이 1인 곳에 대해서만 모두 검색을 해준다.
  2. 가로를 검사하는 경우와 세로를 검사하는 경우를 나누어 주었다.
    1. 세로를 검사하는 경우
      • 시작칸이 첫 번째 칸이거나 바로 앞의 칸 값이 0이어야 한다.
      • 현재 칸을 포함해서 아래로 K칸만큼이 범위를 벗어나면 안 된다.
      • 위의 조건을 만족한다면 현재 칸을 포함한 K칸만큼 동안 하나라도 0을 가지면 false
      • 현재 칸을 포함한 K칸 이후의 바로 다음 칸이 범위를 벗어나지 않는다면 0 값을 가지는지 확인해준다. (1 값을 가지면 false)
    2. 가로를 검사하는 경우도 똑같은 방식으로 j열에 대해서 검사해주면 된다.
  3. check함수를 통해 true 값을 count 값을 증가시킨다.

 

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

public class Solution {

	static int N,K;
	static int[][] puzzle;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		for(int tc=1; tc<=T; tc++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			puzzle = new int[N][N];
			
			for(int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine());
				for(int j=0; j<N; j++) {
					puzzle[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			int count = 0;
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					if(puzzle[i][j] == 0) continue; //단어가 들어갈수 없는 칸
					
					if(i == 0 || puzzle[i-1][j] == 0) { //첫번째 칸이거나 바로 앞에 칸이 0
						if(i+K <= N) { //범위를 넘어가지 않는 경우에만 검사
							if(checkSero(i,j)) {
								count += 1;
							}
						}
					}
					
					
					if(j == 0 || puzzle[i][j-1] == 0) { //첫번째 칸이거나 바로 앞에 칸이 0
						if(j+K <= N) { //범위를 넘어가지 않는 경우에만 검사
							if(checkGaro(i,j)) {
								count += 1;
							}
						}
					}
				}
			}
			
			System.out.println("#"+tc+" "+count);
			
		}
	}
	
	static boolean checkSero(int x, int y) {
		boolean flag = true;
		int n = x+K;
		for(int i=x; i<n; i++) {
			if(puzzle[i][y] == 0) {
				flag = false; //하나라도 0값이 있으면 false (단어를 넣을 수 없으면)
				break;
			}
		}
		if(x+K < N) {
			if(puzzle[x+K][y] == 1)
				flag = false; //넣을 단어보다 칸이 길면 false
		}
		
		return flag;
	}
	
	static boolean checkGaro(int x, int y) {
		boolean flag = true;
		int n = y+K;
		for(int j=y; j<n; j++) {
			if(puzzle[x][j] == 0) {
				flag = false; //하나라도 0값이 있으면 false (단어를 넣을 수 없으면)
				break;
			}
		}
		if(y+K < N) {
			if(puzzle[x][y+K] == 1)
				flag = false; //넣을 단어보다 칸이 길면 false
		}
		
		return flag;
	}

}

 

'SWEA > D2' 카테고리의 다른 글

[SWEA] 1974. 스도쿠 검증  (0) 2019.05.03
[SWEA] 1970. 쉬운 거스름돈  (0) 2019.05.03
[SWEA] 1976. 시각 덧셈  (0) 2019.05.02
[SWEA] 1983. 조교의 성적 매기기  (0) 2019.05.01
[SWEA] 1984. 중간 평균값 구하기  (0) 2019.05.01

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PttaaAZIDFAUq&categoryId=AV5PttaaAZIDFAUq&categoryType=CODE

 

SW Expert Academy

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

www.swexpertacademy.com

시 단위는 12가 넘어가면 12를 빼주고, 분 단위는 60을 넘어가면 분에서 60을 빼주는대신 시 단위에 1을 더해준다.

 

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

public class Solution {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		for(int tc=1; tc<=T; tc++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int h1 = Integer.parseInt(st.nextToken());
			int m1 = Integer.parseInt(st.nextToken());
			int h2 = Integer.parseInt(st.nextToken());
			int m2 = Integer.parseInt(st.nextToken());
			
			int hour = h1+h2;
			if(hour > 12) hour -= 12;
            
			int minute = m1+m2;
			if(minute > 60) {
				minute -= 60;
				hour += 1;
			}
			
			System.out.println("#"+tc+" "+hour+" "+minute);
		}
	}

}

+ Recent posts