문제 : https://www.acmicpc.net/problem/5698

 

5698번: Tautogram

선영이는 시를 매우 좋아한다. 최근에 선영이는 시집을 읽다가 매우 매력적인 시형을 찾았다. Tautogram은 매우 특별한 형태의 두운법으로, 인접한 단어가 같은 글자로 시작하는 것을 말한다. 문장

www.acmicpc.net

문제 요약 : 주어진 문자열이 Tautogram인지 아닌지 판단

입력 출력
1 ≤ 단어 개수 ≤ 50
1 ≤ 단어 길이 ≤ 20
Tautogram 일경우 Y 출력
Tautogram 아닐경우 N 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_5698.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30886357 cbkpar 5698 맞았습니다!! 21916KB 220ms Java 11 656B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		while(true) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			char c = st.nextToken().toLowerCase().charAt(0);
			if(c=='*') break;
			boolean chk = true;
			while(st.hasMoreTokens()) if(st.nextToken().toLowerCase().charAt(0) != c) chk = false;
			sb.append(chk?"Y\n":"N\n");
		}
		System.out.println(sb);
	}
}

첫 단어의 문자의 첫 글자를 기준으로 각 문장의 단어 앞을 비교한다.

이때 단어를 소문자로 치환해 비교한다.

문제 : https://www.acmicpc.net/problem/22115

 

22115번: 창영이와 커피

커피는 종류별로 하나씩 준비되어 있기 때문에, 동일한 커피를 여러 개 마실 수 없음에 유의하라.

www.acmicpc.net

문제 요약 : 원하는 양의 카페인을 위한 커피 최소 개수 출력

입력 출력
1 ≤ N(커피) ≤ 100
0 ≤ K(카페인) ≤ 100000
1 ≤ C(카페인 함유량) ≤ 1000
K만큼 카페인을 섭취하기 위한 커피의 최소 개수

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_22115.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30871682 cbkpar 22115 맞았습니다!! 14596KB 168ms Java 11 747B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,k,c,i;
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());
		int[] dp = new int[k+1];
		st = new StringTokenizer(br.readLine());
		Arrays.fill(dp, 1000000000);
		dp[0] = 0;
		while(n-->0) {
			c = Integer.parseInt(st.nextToken());
			for(i=k;i>=c;i--) dp[i] = Math.min(dp[i], dp[i-c]+1);
		}
		System.out.println(dp[k]>100?"-1":dp[k]);
	}
}

K+1칸의 배열을 만들고 각 칸을 0~K만큼 의 카페인을 위해 섭취한 커피 개수라한다.

이때 모든 칸을 -1로 초기화 한후 필요한 카페인이 0일땐 커피를 마시지 않아도 되므로 0으로 초기화한다.

그 후 커피를 하나씩 확인하며 커피의 카페인 함유량을 C라고 한다면

K부터 C까지 필요한 커피의 개수를 수정해준다.

 

예제 ) 

커피의 수 : 4

필요한 카페인 : 5

카페인 함유량 : 1 1 3 2

문제 : https://www.acmicpc.net/problem/22114

 

22114번: 창영이와 점프

창영이는 버스에서 내린 뒤 회사로 걸어가고 있다. 창영이가 걸어가는 길은 대부분 회색 보도블럭으로 포장되어 있는데, 가끔씩 빨간 보도블럭이 놓여있을 때가 있다. 창영이는 어린 시절 빨간

www.acmicpc.net

문제 요약 : 최대로 밟을 수 있는 블록 개수 출력

입력 출력
2 ≤ N(블럭 개수) ≤ 100000
1 ≤ K(보폭), L(블럭 사이 거리) ≤ 100
임의의 점프를 한번 할 수 있을 때
최대로 밟을 수 있는 블럭 개수 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_22114.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30869039 cbkpar 22114 맞았습니다!! 26132KB 316ms Java 11 929B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,k,i,m;
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());
		int[] arr = new int[n];
		st = new StringTokenizer(br.readLine());
		for(i=0;i<n-1;i++) arr[i] = Integer.parseInt(st.nextToken());
		int[][] dp = new int[n][2];
		dp[0][0] = dp[0][1] = 1;
		for(i=0;i<n-1;i++) {
			if(arr[i]<=k) {
				dp[i+1][0] = dp[i][0] + 1;
				dp[i+1][1] = dp[i][1] + 1;
			}else {
				dp[i+1][0] = 1;
				dp[i+1][1] = dp[i][0] + 1;
			}
		}
		m = 0;
		for(i=0;i<n;i++) {
			m = Math.max(m, dp[i][0]);
			m = Math.max(m, dp[i][1]);
		}
		System.out.println(m);
	}
}

밟은 블럭의 개수를 점프를 사용했는지와 안 했는지로 구분한다.

초기값을 1로 둔 뒤에 블럭을 다음과 같이 차례대로 계산한다.

 

블럭 사이의 거리가 보폭보다 같거나 짧은 경우

점프 미사용[i] = 점프 미사용[i-1] + 1

점프 사용[i] = 점프 사용[i-1] = 1

 

블럭 사이의 거리가 보폭보다 클 경우

점프 미사용[i] = 1

점프 사용[i] = 점프 미사용[i-1] + 1

 

그 후 배열의 가장 큰 값을 출력하면 된다.

 

예제 ) 

7 3

2 3 1 5 3 3

 

문제 : https://www.acmicpc.net/problem/22113

 

22113번: 창영이와 버스

첫째 줄에 도시에 존재하는 버스의 개수 N, 창영이가 이용하는 버스의 개수 M이 주어진다. 둘째 줄에 창영이가 이용하는 M개 버스의 번호가 순서대로 주어진다. 버스 번호는 중복되지 않는다. 셋

www.acmicpc.net

문제 요약 : 환승 요금의 합 출력

입력 출력
2 ≤ N(버스) ≤ 100
1 ≤ M(환승 버스 번호) ≤ N
1 ≤ A_S,E(환승 요금) ≤ 1000
환승 요금의 합을 출력한다.
(최초에 탑승할 때 지불하는 버스요금 제외)

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_22113.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30868093 cbkpar 22113 맞았습니다!! 15392KB 164ms Java 11 831B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,m,i,j,s;
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		int[] arr = new int[m];
		st = new StringTokenizer(br.readLine());
		for(i=0;i<m;i++) arr[i] = Integer.parseInt(st.nextToken());
		int[][] map = new int[n+1][n+1];
		for(i=1;i<=n;i++) {
			st = new StringTokenizer(br.readLine());
			for(j=1;j<=n;j++) map[i][j] = Integer.parseInt(st.nextToken());
		}
		s = 0;
		for(i=1;i<m;i++) s += map[arr[i-1]][arr[i]];
		System.out.println(s);
	}
}

버스에 탑승했던 순서를 배열에 저장한 뒤

각 버스의 환승에 대한 비용을 2차원 배열에 저장하고

각 버스의 환승에 필요한 금액을 불러와 더해준다.

 

예제 )

4 3

3 1 2

0 2 3 4

5 0 7 8

1 2 0 4

5 6 7 0

 

문제 : https://www.acmicpc.net/problem/1269

 

1269번: 대칭 차집합

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어

www.acmicpc.net

문제 요약 : 주어진 집합 A와 B의 대칭 차집합 원소 개수 출력

입력 출력
1 ≤ A, B(원소 개수) ≤ 200000
1 ≤ A[N], B[N] ≤ 100000000
A, B의 대칭차집합 원소 개수 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_1269.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30840117 cbkpar 1269 맞았습니다!! 66516KB 612ms Java 11 821B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int a,b,i,s;
		HashMap<Integer,Boolean> map = new HashMap<>();
		StringTokenizer st = new StringTokenizer(br.readLine());
		s = a = Integer.parseInt(st.nextToken());
		b = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		for(i=0;i<a;i++) map.put(Integer.parseInt(st.nextToken()),true);
		st = new StringTokenizer(br.readLine());
		for(i=0;i<b;i++) {
			if(map.containsKey(Integer.parseInt(st.nextToken()))) {
				s--;
			}else {
				s++;
			}
		}
		System.out.println(s);
	}
}

S의 값을 집합 A의 개수로 초기값을 둔 뒤

HashMap을 이용하여 A의 원소를 모두 넣고

 

B의 원소를 차례대로 확인하며

HashMap에 해당 키가 있을 경우 S를 1 감소시키고

HashMap에 해당 키가 없을 경우 S를 1 증가시킨다.

 

예제 )

A = {1, 2, 4}

B = {2, 3, 4, 5, 6}

 

 

문제 : https://www.acmicpc.net/problem/11536

 

11536번: 줄 세우기

이름이 증가하는 순으로 나타나면 INCREASING, 감소하는 순이면 DECREASING을 한 줄에 출력한다. 만약 위의 두 경우가 아니라면 NEITHER를 출력한다.

www.acmicpc.net

문제 요약 : 주어진 문자열이 오름차순, 내림차순인지 확인

입력 출력
2 ≤ N(이름의 수) ≤ 20
2 ≤ 이름길이(대문자) ≤ 12
오름차순 일경우 INCREASING 출력
내림차순 일경우 DECREASING 출력
둘다 아닐경우 NEITHER 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_11536.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30766359 cbkpar 11536 맞았습니다!! 14236KB 120ms Java 11 616B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,i,s;
		n = Integer.parseInt(br.readLine());
		String[] name = new String[n];
		for(i=0;i<n;i++) name[i] = br.readLine();
		s = 0;
		for(i=0;i<n-1;i++) s += name[i].compareTo(name[i+1])>0?1:-1;
		if(s==n-1) {
			System.out.println("DECREASING");
		}else if(s==1-n) {
			System.out.println("INCREASING");
		}else {
			System.out.println("NEITHER");
		}
	}
}

s 를 0으로 초기화한 후

N개의 문자열을 첫 사람을 제외하고 그 이전 사람과 비교했을 때

오름차순일 경우 1을 더해주고 내림차순일 경우 1을 빼준다.

 

이때 모든 이름이 오름차순일 경우 s 는 n-1 값을 갖게 되고

내림차순 일 경우 1-n의 값을 갖게 된다.

 

 

문제 : https://www.acmicpc.net/problem/10163

 

10163번: 색종이

평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘

www.acmicpc.net

문제 요약 : 색종이가 보이는 부분의 면적 출력

입력 출력
1 ≤ N(색종이 수) ≤ 100
색종이 가로, 세로 크기 ≤ 1001
N줄의 x좌표 y좌표 너비 높이
1번부터 N번까지 각 색종이가 보이는 면적 출력

 

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_10163.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30731243 cbkpar 10163 100점 25604KB 304ms Java 11 902B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
		int n,i,j,k,a,b,c,d;
		n = Integer.parseInt(br.readLine());
		int[] cnt = new int[n+1];
		int[][] map = new int[1001][1001];
		for(i=1;i<=n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			a = Integer.parseInt(st.nextToken());
			b = Integer.parseInt(st.nextToken());
			c = Integer.parseInt(st.nextToken());
			d = Integer.parseInt(st.nextToken());
			for(j=a;j<a+c;j++) for(k=b;k<b+d;k++) map[j][k] = i;
		}
		for(i=0;i<1001;i++) for(j=0;j<1001;j++) cnt[map[i][j]]++;
		for(i=1;i<=n;i++) sb.append(cnt[i]+"\n");
		System.out.println(sb);
	}
}

N장의 색종이를 각각  N번이라 하고 배열에 각 종이의 번호를 적는다.

그 후에 배열에 적힌 숫자들을 총합하여 출력한다.

 

예제 ) 

4

0 2 10 10

7 9 8 4

8 4 10 6

6 0 12 10

 

 

첫번째 종이 62 칸

두번째 종이 24 칸

세번째 종이 0 칸

세번째 종이 120 칸

문제 : https://www.acmicpc.net/problem/6965

 

6965번: Censor

The input to your program consists of an integer, n, on a line by itself, followed by n lines of text. Each line of text contains words separated by spaces. Each word consists of letters of the alphabet and exactly one space separates adjacent words. There

www.acmicpc.net

문제 요약 : 문자열중 4글자로 된 문자 변환

입력 출력
1 ≤ 각 문장 길이 ≤ 80
4글자로 된 문자를 ****로 치환 후 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_6965.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30722726 cbkpar 6965 맞았습니다!! 14296KB 128ms Java 11 729B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
		int n,i;
		n = Integer.parseInt(br.readLine());
		for(i=0;i<n;i++) {
			if(i!=0) sb.append("\n");
			StringTokenizer st = new StringTokenizer(br.readLine());
			boolean chk = false;
			while(st.hasMoreTokens()) {
				if(chk) sb.append(" ");
				String str = st.nextToken();
				sb.append(str.length()==4?"****":str);
				chk = true;
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
}

 

문장을 한줄씩 받고 공백을 기준으로 쪼개어 단어길이가 4인 경우에 ****로 치환해준다.

 

+ Recent posts