📙 Algorithm Solving/Java
📙[Algo] 24/01/20 ~ 24.01.21 알고리즘
혜덕hyeduck
2024. 1. 21. 21:19
알고리즘 문제) BOJ 6472. 고냥이
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
문제 요약
- 최대 N개의 종류의 알파벳을 가진 연속된 문자열밖에 인식
시간 제한
- 1
입력
- 인식할 수 있는 알파벳의 종류의 최대 개수 N이 입력된다. (1 < N ≤ 26)
- 문자열이 주어진다. (1 ≤ 문자열의 길이 ≤ 100,000) 단, 문자열에는 알파벳 소문자만이 포함된다.
출력
- 번역기가 인식할 수 있는 문자열의 최대길이를 출력
코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
String str = br.readLine();
int[] ch = new int[26];
int ans = 0;
int s = 0, e = 0, cnt = 1;
ch[str.charAt(0)-'a']++;
while (s <= e) {
if (cnt <= N) {
ans = Math.max(ans, e - s + 1);
e++;
if( e == str.length()) break;
if(ch[str.charAt(e)-'a'] == 0){
cnt++;
}
ch[str.charAt(e)-'a']++;
} else {
if (ch[str.charAt(s)-'a'] <= 1) {
cnt--;
}
ch[str.charAt(s)-'a']--;
s++;
}
}
bw.write(String.valueOf(ans));
bw.flush();
bw.close();
br.close();
}
}
알고리즘 문제) BOJ 20366. 같이 눈사람 만들래?
20366번: 같이 눈사람 만들래?
높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1
www.acmicpc.net
문제 요약
- N개의 눈덩이
- 각 눈덩이 지름은 Hi
- 눈사람은 두 개의 눈덩이로 구성
- 눈사람의 키 = 눈덩이 지름의 합
- 눈덩이 N개중 서로 다른 4개를 골라 눈사람 만들었을 때, 둘의 키 차이의 최솟값 구하기
시간 제한
- 2초(200000000)
입력
- N (4≤N≤600)
- 각 눈덩이의 지름 (1≤Hi≤1000000000)
출력
- 두 눈 사람의 키 차이 최솟값 출력
접근법
- 완전 탐색으로 접근하기
- 4중 for문으로 일일이 눈덩이를 고르고 최솟값 갱신
- 최적화 진행하기
- 일단 엘자의 눈덩이를 선택한다 ⇒ 360000
- 2 3 4
5 510 11
- 5, 5을 선택한 상황
- 같은 눈덩이를 선택하는 경우는 필터링
- 2 3 4 10 11
s e - s→2, e→11
- s+e = 13
- 13 > 10
- e기준 가장 작은 애랑 더한 것이므로, e-=1
- s→2, e→10
- s+e = 12
- 12 > 10
- e기준 가장 작은 애랑 더한 것이므로, e-=1
- s→2, e→4
- s+e = 6
- 6 < 10
- s기준 가장 큰 애랑 더한 것이므로, s+=1
- s→3, e→4
- s+e = 7
- 7<10
- s기준 가장 큰 애랑 더한 것이므로, s+=1
- s→4, e→4
- 같은 애를 가리키므로 종료
코드
import java.io.*;
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] snow = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
snow[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(snow);
int elsaSnow, s, e, ans = Integer.MAX_VALUE;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(i == j) continue;
elsaSnow = snow[i] + snow[j];
s = 0; e = N-1;
while (s < e) {
if(s == i || s == j){
s++;
continue;
}
if (e == i || e == j) {
e--;
continue;
}
ans = Math.min(ans, Math.abs(elsaSnow - (snow[s] + snow[e])));
if (snow[s] + snow[e] < elsaSnow) {
s++;
} else if (snow[s] + snow[e] > elsaSnow) {
e--;
} else {
break;
}
}
}
}
bw.write(String.valueOf(ans));
bw.flush();
bw.close();
br.close();
}
}
알고리즘 문제) BOJ 22945. 팀 빌딩
22945번: 팀 빌딩
개발자 $N$명이 팀 빌딩을 위해 한 줄로 서있다. 하나의 팀을 만들기 위해서는 개발자 2명이 반드시 모여야 한다. 개발자 A와 개발자 B가 팀을 만들 때 팀의 능력치는 아래와 같이 계산이 된다. (개
www.acmicpc.net
문제 요약
- 개발자 N명 팀 빌딩
- 하나의 팀을 만들려면 개발자 2명이 반드시 모일 것
- 팀 능력치 = (개발자 A와 개발자 B사이 다른 개발자 수) * min(개발자 A의 능력치, B의 능력치)
- 팀 빌딩에서 나올 수 있는 능력치 최댓값?
시간 제한
- 1초
입력
- 개발자 수 N
- 2≤N≤100,000
- N의 개발자의 각 능력치 xi가 공백으로 구분됨
- 11≤xi≤10,000 , xi는 정수
출력
- 팀의 능력치 최댓값 출력
접근법
- 완전 탐색으로 생각하기
- 일단 순서를 바꾸면 안 됨
- 2중 for문으로 일일이 모든 경우의 팀 능력치 탐색
- A개발자 선택 → B개발자 선택
- 최적화 하기
1 4 2 5
s e- s→1, e→5
- 능력치 = 2 * 1 = 2
- 둘 사이에 있는 개발 자 수는 최댓값이므로 남은 경우는 적을 수 밖에 없다.
- 능력치를 비교했을 때 arr[s] < arr[e]이므로 s를 한 칸 이동
- s → 4, e→5
- 능력치 = 1*4 = 4
- arr[s] < arr[e]이므로 s를 한 칸 이동
- s → 2, e→5
- 능력치 = 0*2= 0
- arr[s] < arr[e]이므로 s를 한 칸 이동
- s==e이므로 종료
- s→ 2, e→5
- 둘 사이에 후보가 없으므로 종료
- s→1, e→5
코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int s = 0, e = N - 1, ans = 0;
while (s < e) {
ans = Math.max(ans, (e - s - 1) * Math.min(arr[s], arr[e]));
if (arr[s] > arr[e]) {
e--;
} else {
s++;
}
}
bw.write(String.valueOf(ans));
bw.flush();
bw.close();
br.close();
}
}