반응형

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		String str = sc.nextLine();
		String strr = sc.nextLine();
		int[][] dp = new int[1002][1002];
		
		String s1 = "0"+str;
		String s2 = "0"+strr;
		
		char[] ar = s1.toCharArray();
		char[] arr = s2.toCharArray();	
		
		for(int i=1;i<ar.length;i++){
			for(int j=1;j<arr.length;j++){
				if(ar[i] == arr[j]){
					dp[i][j] = dp[i-1][j-1]+1;
				}else{
					dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
				}
			}
		}
		
		System.out.println(dp[ar.length-1][arr.length-1]);
	}
}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

[Baekjoon] #5054 주차의 신  (0) 2024.04.18
[Baekjoon] #5567 결혼식  (0) 2024.04.18
[Baekjoon] #9328 열쇠  (0) 2024.04.08
[Baekjoon] #9461 파도반 수열  (0) 2024.04.08
[Baekjoon] #9465 스티커  (0) 2024.04.08
반응형

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Location{
	int x;
	int y;
	
	public Location(int x, int y) {
		// TODO Auto-generated constructor stub
		this.x = x;
		this.y = y;
	}
}

public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		int tc = sc.nextInt();
		
		for(int testcase=0;testcase<tc;testcase++){
			
			int h = sc.nextInt();
			int w = sc.nextInt();
			int cnt =0;
			boolean flag = false; // 새로운 키를 획득하는지에 따른 여부
			
			char[][] map = new char[h][w];
			int[][] visit = new int[h][w];
			Queue<Location> q = new LinkedList<>();
			ArrayList<Character> ar = new ArrayList<>();
			
			for(int i=0;i<h;i++){
				String str = sc.next();
				char[] c = str.toCharArray();
				for(int j=0;j<w;j++){
					map[i][j] = c[j];
					//charAt 과 toCharArray 속도 비교
				}
			}
			
			String strKey = sc.next();
			for(int i=0;i<strKey.length();i++){
				ar.add(strKey.charAt(i));
			}
			
			while(!flag){
				
				flag = true;
				
				for(int i=0;i<h;i+=h-1){
					for(int j=0;j<w;j++){
						if(map[i][j] == '.'){
							q.offer(new Location(i, j));
						}else if('a'<=map[i][j] && map[i][j] <= 'z'){
							ar.add(map[i][j]);
							map[i][j] = '.';
							flag = false;
							q.offer(new Location(i, j));
						}else if('A'<=map[i][j] && map[i][j] <= 'Z'){
							for(int k=0;k<ar.size();k++){
								if(map[i][j] == ar.get(k)-32){
									map[i][j] = '.';
									q.offer(new Location(i, j));
								}
							}
						}else if(map[i][j] == '$'){
							cnt++;
							map[i][j] = '.';
						}
					}
				}
				
				for(int i=0;i<w;i+=w-1){
					for(int j=0;j<h;j++){
						if(map[j][i] == '.'){
							q.offer(new Location(j, i));
						}else if('a'<=map[j][i] && map[j][i] <= 'z'){
							ar.add(map[j][i]);
							map[j][i] = '.';
							flag = false;
							q.offer(new Location(j, i));
						}else if('A'<=map[j][i] && map[j][i] <= 'Z'){
							for(int k=0;k<ar.size();k++){
								if(map[j][i] == ar.get(k)-32){
									map[j][i] = '.';
									q.offer(new Location(j, i));
								}
							}
						}else if(map[j][i] == '$'){
							cnt++;
							map[j][i] = '.';
						}
					}
				}
				
				//System.out.println("=== while Start ===");
				while(!q.isEmpty()){
					
					
					int[] xx = {-1,0,1,0};
					int[] yy = {0,1,0,-1};
									
					int x = q.peek().x;
					int y = q.poll().y;
					
					//System.out.println("-> 현재 위치  : map["+x+"]["+y+"]");
					
					for(int i=0;i<4;i++){
						
						int ax = x+xx[i];
						int ay = y+yy[i];
						
						if(ax>=0 && ay>=0 && ax<h && ay< w){
							if(map[ax][ay] =='.' && visit[ax][ay] == 0){
								visit[ax][ay] = 1;
								//System.out.println("빈곳 체크 : map["+ax+"]["+ay+"]");
								q.offer(new Location(ax, ay));
							}else if('a'<=map[ax][ay] && map[ax][ay] <='z' && visit[ax][ay] == 0){
								ar.add(map[ax][ay]);
								//System.out.println("열쇠 획득 : map["+ax+"]["+ay+"] : "+map[ax][ay]);
								map[ax][ay] = '.';
								visit[ax][ay] = 1;
								flag = false;
								q.offer(new Location(ax, ay));
							}else if('A'<=map[ax][ay] && map[ax][ay]<='Z' && visit[ax][ay] == 0){
								for(int aa = 0; aa<ar.size();aa++){
									if(map[ax][ay] == ar.get(aa)-32){
										map[ax][ay] = '.';
										visit[ax][ay] = 1;
										//System.out.println("문 체크 : map["+ax+"]["+ay+"]");
										q.offer(new Location(ax, ay));
									}
								}
							}else if(map[ax][ay] == '$' && visit[ax][ay] == 0){
								visit[ax][ay] = 1;
								cnt++;
								map[ax][ay] = '.';
								//System.out.println("★문서 체크 : map["+ax+"]["+ay+"]");
								q.offer(new Location(ax, ay));
							}else if(map[ax][ay] == '*' && visit[ax][ay] == 0){
								//System.out.println("벽 체크 : map["+ax+"]["+ay+"]");
								continue;
							}
						}
					}
				}
				
				
				for(int i=0;i<h;i++){
					for(int j=0;j<w;j++){
						visit[i][j] = 0;
					}
				}
				
			}
			
			
				
			
			System.out.println(cnt);
			
		}
		
	}
}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

[Baekjoon] #5567 결혼식  (0) 2024.04.18
[Baekjoon] #9251 LCS  (0) 2024.04.08
[Baekjoon] #9461 파도반 수열  (0) 2024.04.08
[Baekjoon] #9465 스티커  (0) 2024.04.08
[Baekjoon] #10250 ACM 호텔  (0) 2024.04.08
반응형

 

import java.util.Scanner;

//Q)파도반 수열
//#9461

public class Main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int tc = sc.nextInt();
		long[] result = new long[tc];
		int n;
		long[] dp = new long[101];
		
		dp[1] = 1;
		dp[2] = 1;
		dp[3] = 1;
		
		for(int i=0;i<tc;i++){
			
			n = sc.nextInt(); // P(N) 파도반 수열 입력
			for(int j=3;j<=n;j++){
				dp[j] = dp[j-2]+dp[j-3];
			}
			
			result[i] = dp[n];
		}
		
		for(int i=0;i<tc;i++){
			System.out.println(result[i]);
		}
	}
}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

[Baekjoon] #9251 LCS  (0) 2024.04.08
[Baekjoon] #9328 열쇠  (0) 2024.04.08
[Baekjoon] #9465 스티커  (0) 2024.04.08
[Baekjoon] #10250 ACM 호텔  (0) 2024.04.08
[Baekjoon] #10801 카드게임  (0) 2024.04.08
반응형

import java.util.Scanner;

//Q) 스티커
//#9465
public class Main {


	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int tc = sc.nextInt(); // Test Case
		int[] result = new int[tc];
		
		for(int i=0;i<tc;i++){
		
			int n = sc.nextInt();
			int[][] ar = new int[2][100001];
			int[][] dp = new int [2][100001];
			
			for(int j=0;j<2;j++){
				for(int k=1;k<=n;k++){
					ar[j][k] = sc.nextInt();
				}
			}//스티커 점수 입력
			
			dp[0][0]=0;
			dp[1][0]=0;
			dp[0][1] = ar[0][1];
			dp[1][1] = ar[1][1];
			
			//시작점은 항상 앞에 두개 중 하나
			for(int j=2;j<=n;j++){
				dp[0][j] = getMax(dp[1][j-1], dp[1][j-2]) +ar[0][j]; 
				dp[1][j] = getMax(dp[0][j-1], dp[0][j-2]) +ar[1][j];
			}
			
			//대각선 고려
			
			result[i] = getMax(dp[0][n], dp[1][n]);
			
		}//Test Case 종료
		
		for(int i=0;i<tc;i++){
			System.out.println(result[i]);
		}
	}
	
	public static int getMax(int a, int b){
		if(a>b){
			return a;
		}else{
			return b;
		}
		
	}

}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

[Baekjoon] #9328 열쇠  (0) 2024.04.08
[Baekjoon] #9461 파도반 수열  (0) 2024.04.08
[Baekjoon] #10250 ACM 호텔  (0) 2024.04.08
[Baekjoon] #10801 카드게임  (0) 2024.04.08
[Baekjoon] #10809 알파벳 찾기  (0) 2024.04.08
반응형

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		
		int tc = sc.nextInt();
		String[] result = new String[tc];
		
		for(int i=0;i<tc; i++) {
			
			int idx = 0;
			int h = sc.nextInt();
			int w = sc.nextInt();
			int n = sc.nextInt();
			
			while(true) {
				if(idx * h >= n) {
					n = n - ((idx-1)*h);
				
					if(idx < 10) {
						result[i] = String.valueOf(n) + "0" + String.valueOf(idx);
						break;
					}else {
						result[i] = String.valueOf(n) + "" + String.valueOf(idx);
						break;
					}
				}else {
					idx++;
				}
			}
		}
		
		for(int i=0;i<result.length;i++) {
			System.out.println(result[i]);
		}
	}

}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

[Baekjoon] #9461 파도반 수열  (0) 2024.04.08
[Baekjoon] #9465 스티커  (0) 2024.04.08
[Baekjoon] #10801 카드게임  (0) 2024.04.08
[Baekjoon] #10809 알파벳 찾기  (0) 2024.04.08
[Baekjoon] #11725 트리의 부모 찾기  (0) 2024.04.08

+ Recent posts