Skip to content

Commit 52c5d6a

Browse files
Merge pull request #8 from algorithm-cote-study/seunggu/week4
feat: 4주차 알고리즘 문제 및 테스트 파일
2 parents 5424026 + 129af83 commit 52c5d6a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1366
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package sgyj.inflearn.seunggu.week4;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import java.util.Map.Entry;
9+
10+
public class Solution31 {
11+
12+
/**
13+
* @title : 학급 회장(해쉬)
14+
* @description : 학급 회장을 뽑는데 후보로 기호 A, B, C, D, E 후보가 등록을 했습니다.
15+
* 투표용지에는 반 학생들이 자기가 선택한 후보의 기호(알파벳)가 쓰여져 있으며 선생님은 그 기호를 발표하고 있습니다.
16+
* 선생님의 발표가 끝난 후 어떤 기호의 후보가 학급 회장이 되었는지 출력하는 프로그램을 작성하세요.
17+
* 반드시 한 명의 학급회장이 선출되도록 투표결과가 나왔다고 가정합니다.
18+
* @input : 첫 줄에는 반 학생수 N(5<=N<=50)이 주어집니다.
19+
* 두 번째 줄에 N개의 투표용지에 쓰여져 있던 각 후보의 기호가 선생님이 발표한 순서대로 문자열로 입력됩니다.
20+
* @output : 학급 회장으로 선택된 기호를 출력합니다.
21+
*/
22+
public static void main ( String[] args ) {
23+
try ( BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) ) ) {
24+
System.out.println(solution(reader));
25+
} catch ( IOException e ) {
26+
e.printStackTrace();
27+
}
28+
}
29+
30+
static String solution ( BufferedReader reader ) throws IOException {
31+
int studentCount = Integer.parseInt( reader.readLine() );
32+
String vote = reader.readLine();
33+
String[] votes = vote.split( "" );
34+
Map<String, Integer> map = new HashMap<>();
35+
for ( String s : votes ) {
36+
map.put(s, map.getOrDefault( s, 0 ) + 1);
37+
}
38+
String result = "";
39+
int max = Integer.MIN_VALUE;
40+
for ( Entry<String, Integer> entry : map.entrySet() ) {
41+
if(entry.getValue() > max) {
42+
result = entry.getKey();
43+
max = entry.getValue();
44+
}
45+
}
46+
return result;
47+
}
48+
49+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package sgyj.inflearn.seunggu.week4;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import java.util.Map.Entry;
9+
10+
public class Solution32 {
11+
12+
/**
13+
* @title : 아나그램(해쉬)
14+
* @description : Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 합니다.
15+
* 예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로
16+
* 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.
17+
* 길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세요. 아나그램 판별시 대소문자가 구분됩니다.
18+
* @input : 첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됩니다.
19+
* 단어의 길이는 100을 넘지 않습니다.
20+
* @output : 두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력합니다.
21+
*/
22+
public static void main ( String[] args ) {
23+
try ( BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) ) ) {
24+
System.out.println(solution(reader));
25+
} catch ( IOException e ) {
26+
e.printStackTrace();
27+
}
28+
}
29+
30+
static String solution ( BufferedReader reader ) throws IOException {
31+
String firstWord = reader.readLine();
32+
String secondWord = reader.readLine();
33+
Map<String, Integer> firstMap = new HashMap<>();
34+
Map<String, Integer> secondMap = new HashMap<>();
35+
setMap( firstMap, firstWord.split( "" ) );
36+
setMap( secondMap, secondWord.split( "" ) );
37+
for ( Entry<String, Integer> entry : firstMap.entrySet() ) {
38+
int firstValue = entry.getValue();
39+
int secondValue = secondMap.getOrDefault( entry.getKey(),0 );
40+
if(firstValue != secondValue) {
41+
return "NO";
42+
}
43+
}
44+
return "YES";
45+
}
46+
47+
private static void setMap ( Map<String, Integer> map, String[] words ) {
48+
for ( String word : words ) {
49+
map.put( word, map.getOrDefault( word, 0 ) + 1 );
50+
}
51+
}
52+
53+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package sgyj.inflearn.seunggu.week4;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.Arrays;
7+
import java.util.HashMap;
8+
import java.util.HashSet;
9+
import java.util.Map;
10+
import java.util.Set;
11+
12+
public class Solution33 {
13+
14+
/**
15+
* @title : 매출액의 종류
16+
* @description : 현수의 아빠는 제과점을 운영합니다. 현수아빠는 현수에게 N일 동안의 매출기록을 주고 연속된 K일 동안의 매출액의 종류를
17+
* 각 구간별로 구하라고 했습니다.
18+
* 만약 N=7이고 7일 간의 매출기록이 아래와 같고, 이때 K=4이면
19+
* 20 12 20 10 23 17 10
20+
* 각 연속 4일간의 구간의 매출종류는
21+
* 첫 번째 구간은 [20, 12, 20, 10]는 매출액의 종류가 20, 12, 10으로 3이다.
22+
* 두 번째 구간은 [12, 20, 10, 23]는 매출액의 종류가 4이다.
23+
* 세 번째 구간은 [20, 10, 23, 17]는 매출액의 종류가 4이다.
24+
* 네 번째 구간은 [10, 23, 17, 10]는 매출액의 종류가 3이다.
25+
* N 일간의 매출기록과 연속구간의 길이 K가 주어지면 첫 번째 구간부터 각 구간별
26+
* 매출액의 종류를 출력하는 프로그램을 작성하세요.
27+
* @input : 첫 줄에 N(5<=N<=100,000)과 K(2<=K<=N)가 주어집니다.
28+
* 두 번째 줄에 N개의 숫자열이 주어집니다. 각 숫자는 500이하의 음이 아닌 정수입니다.
29+
* @output : 첫 줄에 각 구간의 매출액 종류를 순서대로 출력합니다.
30+
*/
31+
public static void main ( String[] args ) {
32+
try ( BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) ) ) {
33+
System.out.println(solution(reader));
34+
} catch ( IOException e ) {
35+
e.printStackTrace();
36+
}
37+
}
38+
39+
static String solution ( BufferedReader reader ) throws IOException {
40+
String[] words = reader.readLine().split( " " );
41+
int repeat = Integer.parseInt( words[1] );
42+
int size = Integer.parseInt( words[0] );
43+
int[] array = Arrays.stream( reader.readLine().split( " " ) ).mapToInt( Integer::parseInt ).toArray();
44+
StringBuilder stringBuilder = new StringBuilder();
45+
Map<Integer, Integer> map = new HashMap<>();
46+
for(int i=0; i< repeat; i++) {
47+
map.put( array[i], map.getOrDefault( array[i], 0 ) + 1 );
48+
}
49+
stringBuilder.append( map.size() ).append( " " );
50+
51+
for(int i=0; i< size-repeat; i++) {
52+
int number = map.getOrDefault( array[i], 0 );
53+
if(number == 1) {
54+
map.remove( array[i] );
55+
} else {
56+
map.put( array[i], number -1 );
57+
}
58+
map.put( array[i+repeat], map.getOrDefault( array[i+repeat], 0 ) + 1 );
59+
stringBuilder.append( map.size() ).append( " " );
60+
}
61+
return stringBuilder.toString();
62+
}
63+
64+
static String solution_fail(BufferedReader reader) throws IOException {
65+
String[] words = reader.readLine().split( " " );
66+
int repeat = Integer.parseInt( words[1] );
67+
int[] array = Arrays.stream( reader.readLine().split( " " ) ).mapToInt( Integer::parseInt ).toArray();
68+
int lt = 0;
69+
StringBuilder stringBuilder = new StringBuilder();
70+
while(lt + repeat <= array.length) {
71+
Set<Integer> set = new HashSet<>();
72+
for(int i=lt; i<lt+repeat; i++) {
73+
set.add( array[i] );
74+
}
75+
stringBuilder.append( set.size() ).append( " " );
76+
lt++;
77+
}
78+
79+
return stringBuilder.toString();
80+
}
81+
82+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package sgyj.inflearn.seunggu.week4;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import java.util.Objects;
9+
10+
public class Solution34 {
11+
12+
/**
13+
* @title : 모든 아나그램 찾기
14+
* @description : S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하세요.
15+
* 아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.
16+
* @input : 첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.
17+
* S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.
18+
* @output : S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.
19+
*/
20+
public static void main ( String[] args ) {
21+
try ( BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) ) ) {
22+
System.out.println(solution(reader));
23+
} catch ( IOException e ) {
24+
e.printStackTrace();
25+
}
26+
}
27+
28+
static int solution ( BufferedReader reader ) throws IOException {
29+
char[] words = reader.readLine().toCharArray();
30+
31+
String anagram = reader.readLine();
32+
char[] anagrams = anagram.toCharArray();
33+
Map<Character, Integer> originMap = new HashMap<>();
34+
for ( char ana : anagrams ) {
35+
originMap.put( ana, originMap.getOrDefault( ana, 0 ) + 1 );
36+
}
37+
int result = 0;
38+
int lt = 0;
39+
while(lt+anagram.length() <= words.length) {
40+
Map<Character, Integer> map = new HashMap<>();
41+
for(int i=lt; i<lt+anagrams.length; i++) {
42+
map.put( words[i], map.getOrDefault( words[i], 0 ) + 1 );
43+
}
44+
boolean flag = true;
45+
for ( char ana : anagrams ) {
46+
if( !Objects.equals( map.getOrDefault( ana, 0 ), originMap.getOrDefault( ana, 0 ) ) ) {
47+
flag = false;
48+
break;
49+
}
50+
}
51+
if(flag) result ++;
52+
lt++;
53+
}
54+
return result;
55+
}
56+
57+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package sgyj.inflearn.seunggu.week4;
2+
3+
import java.io.IOException;
4+
import java.io.BufferedReader;
5+
import java.io.InputStreamReader;
6+
import java.util.Arrays;
7+
import java.util.ArrayList;
8+
import java.util.Comparator;
9+
import java.util.List;
10+
import java.util.stream.*;
11+
12+
public class Solution35 {
13+
14+
/**
15+
* @title : K번째 큰수
16+
* @description : 현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 같은 숫자의 카드가 여러장 있을 수 있습니다.
17+
* 현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려고 합니다. 3장을 뽑을 수 있는 모든 경우를 기록합니다.
18+
* 기록한 값 중 K번째로 큰 수를 출력하는 프로그램을 작성하세요.
19+
* 만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값은 22입니다.
20+
* @input : 첫 줄에 자연수 N(3<=N<=100)과 K(1<=K<=50) 입력되고, 그 다음 줄에 N개의 카드값이 입력된다.
21+
* @output : 첫 줄에 K번째 수를 출력합니다. K번째 수가 존재하지 않으면 -1를 출력합니다.
22+
*/
23+
public static void main( String[] args ) {
24+
25+
try( BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
26+
27+
System.out.println(solution( reader ));
28+
29+
} catch (IOException e) {
30+
e.printStackTrace();
31+
}
32+
33+
}
34+
35+
static int solution ( BufferedReader reader ) throws IOException {
36+
String[] line = reader.readLine().split(" ");
37+
int k = Integer.parseInt(line[1]);
38+
int[] array = Arrays.stream(reader.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
39+
int lt = 0;
40+
int rt = 1;
41+
int size = array.length;
42+
List<Integer> list = new ArrayList<>();
43+
while( lt < size ) {
44+
int a = array[lt];
45+
for(int i= rt; i < size; i++) {
46+
int b = array[i];
47+
for(int j=i+1; j < size; j++) {
48+
int c = array[j];
49+
list.add( a + b + c);
50+
}
51+
}
52+
lt++;
53+
rt++;
54+
}
55+
return getNumberOfKIndex( list, k );
56+
}
57+
58+
static int getNumberOfKIndex(List<Integer> list, int k) {
59+
list = list.stream().sorted( Comparator.reverseOrder() ).distinct().collect( Collectors.toList());
60+
if(list.size() < k) {
61+
return -1;
62+
}
63+
return list.get(k-1);
64+
}
65+
66+
}

0 commit comments

Comments
 (0)