STUDY/Coding Test
[하계 코딩테스트 특강] 2022.07.05 문자열 조작
sseni
2022. 7. 5. 14:52
728x90
# String 클래스 메서드
# HashMap 메서드
1) 문자열 압축
- java
import java.io.*;
import java.util.*;
public class Main {
public String solution(String s){
String ans = "";
s += " ";
int cnt = 1;
for(int i=0; i < s.length()-1; i++){
if(s.charAt(i) == s.charAt(i+1)){
cnt++;
}
else {
ans += s.charAt(i);
if(cnt > 1) ans += String.valueOf(cnt);
cnt = 1;
}
}
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("KKHSSSSSSSEEE"));
}
}
- python
def solution(s):
answer=""
cnt=1
s=s+" "
n=len(s)
for i in range(n-1):
if s[i]==s[i+1]:
cnt+=1
else:
answer+=s[i]
if cnt>1:
answer+=str(cnt)
cnt=1
return answer
print(solution("KKHSSSSSSSEEE"))
2) 회문 문자열
- java
import java.io.*;
import java.util.*;
public class Main {
// 1
public String solution(String s){
String ans = "NO";
String tmp = new StringBuilder(s).reverse().toString();
if(tmp.equalsIgnoreCase(s)) ans = "YES"; // 대소문자 무시하고 비교
return ans;
}
// 2
public String solution(String s){
String ans = "NO";
// s = s.toUpperCase();
int left = 0;
int right = s.length()-1;
while (left < right){
char c1 = Character.toLowerCase(s.charAt(left)); // char 대문자 -> 소문자
char c2 = Character.toLowerCase(s.charAt(right));
if (c1 != c2) return ans;
else {
left++;
right--;
}
}
ans = "YES";
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("gooG"));
}
}
- python
def solution(s):
answer="YES"
s=s.upper()
if s!=s[::-1]:
return "NO"
return answer
print(solution("sttS"))
print(solution("sktS"))
def solution(s):
answer="YES"
s=s.upper()
lt=0
rt=len(s)-1
while(lt<rt):
if s[lt]!=s[rt]:
return "NO"
else:
lt+=1
rt-=1
return answer
print(solution("sttS"))
print(solution("sktS"))
3) 특정 문자 뒤집기
- java
import java.io.*;
import java.util.*;
import static java.lang.Character.isAlphabetic;
public class Main {
public String solution(String s){
String ans = "";
char[] str = s.toCharArray();
int left = 0;
int right = s.length()-1;
while (left < right){
boolean b1 = isAlphabetic(str[left]);
boolean b2 = isAlphabetic(str[right]);
if(b1 && b2){
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
else if(!b1) left++;
else if(!b2) right--;
}
ans = String.valueOf(str);
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("a#b!GE*T@S"));
}
}
- python
def solution(s):
answer=list(s)
lt=0
rt=len(s)-1
while(lt<rt):
if not answer[lt].isalpha():
lt+=1
elif not answer[rt].isalpha():
rt-=1
else:
tmp=answer[lt]
answer[lt]=answer[rt]
answer[rt]=tmp
lt+=1
rt-=1
return "".join(answer)
print(solution("a#b!GE*T@S"))
4) 회문문자열 2
- java 1
import java.io.*;
import java.util.*;
public class Main {
public String solution(String s){
String ans = "NO";
s = s.toLowerCase();
int left = 0;
int right = s.length()-1;
int cnt = 0;
while (left < right){
if (s.charAt(left) != s.charAt(right)) {
if(s.charAt(left+1) == s.charAt(right)) left++;
else if(s.charAt(left) == s.charAt(right-1)) right--;
else return ans;
if(cnt == 1) return ans;
else cnt++;
}
else {
left++;
right--;
}
}
ans = "YES";
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("abcacbakcba"));
}
}
- java 2
import java.util.*;
class Main {
public Boolean isPalindrome(String s){
Boolean answer=true;
int rt=s.length()-1;
int lt=0;
while(lt<rt){
if(s.charAt(lt)!=s.charAt(rt)) return false;
else{
lt++;
rt--;
}
}
return answer;
}
public String solution(String s){
String answer="YES";
int rt=s.length()-1;
int lt=0;
while(lt<rt){
if(s.charAt(lt)!=s.charAt(rt)){
String s1=s.substring(lt, rt);
String s2=s.substring(lt+1, rt+1);
if(!isPalindrome(s1) && !isPalindrome(s2)) return "NO";
else break;
}
lt++;
rt--;
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
System.out.println(T.solution("abcabbakcba"));
System.out.println(T.solution("abcacbakcba"));
}
}
- python
def solution(s):
answer="YES"
lt=0
rt=len(s)-1
while(lt<rt):
if s[lt]!=s[rt]:
sub1=s[lt:rt]
sub2=s[lt+1:rt+1]
if sub1!=sub1[::-1] and sub2!=sub2[::-1]:
answer="NO"
break
else:
lt+=1
rt-=1
return answer
print(solution("abcacbakcba"))
print(solution("abcabbakcba"))
5) 학급 회장
- java
import java.io.*;
import java.util.*;
public class Main {
public char solution(String s){
char ans = ' ';
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
for(char c : s.toCharArray()){ // s 를 문자 배열형으로
hm.put(c, hm.getOrDefault(c, 0) + 1); // 해당 문자가 처음이면 0으로 default
}
int max = Integer.MIN_VALUE;
for(char key : hm.keySet()){ // hashmap 의 key 들의 모임
if (max < hm.get(key)) {
max = hm.get(key);
ans = key;
}
}
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("BACBACCACCBDEDE"));
}
}
- python
from collections import Counter
def solution(s):
answer=""
sH={}
sH=Counter(s)
largest=0
for [key, val] in sH.items():
if val>largest:
largest=val
answer=key
return answer
print(solution("BACBACCACCBDEDE"))
import collections
def solution(s):
answer=""
sH=collections.defaultdict(int)
for x in s:
sH[x]+=1
largest=0
for key in sH:
if sH[key]>largest:
largest=sH[key]
answer=key
return answer
print(solution("BACBACCACCBDEDE"))
6) 한 번 사용한 최초 문자
- java
import java.io.*;
import java.util.*;
public class Main {
public int solution(String s){
int ans = -1;
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
for(char c : s.toCharArray()) // s 를 문자 배열형으로
hm.put(c, hm.getOrDefault(c, 0) + 1); // 해당 문자가 처음이면 0으로 default
for(int i=0; i < s.length(); i++)
if(hm.get(s.charAt(i)) == 1) return i+1;
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("aabb"));
}
}
- python
import collections
def solution(s):
sH=collections.Counter(s)
for index, val in enumerate(s):
if sH[val]==1:
return index+1
return -1
print(solution("softbananas"))#2
print(solution("stringshowtime"))#3
print(solution("showshowmine"))#9
print(solution("statitsics"))#3
print(solution("aabb"))#8
7) 같은 빈도수 만들기
- java
import java.io.*;
import java.util.*;
public class Main {
public ArrayList solution(String s){
ArrayList<Integer> ans = new ArrayList<>();
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
for(char c : s.toCharArray()) // s 를 문자 배열형으로
hm.put(c, hm.getOrDefault(c, 0) + 1); // 해당 문자가 처음이면 0으로 default
int max = Integer.MIN_VALUE;
for(char key : hm.keySet()) // hashmap 의 key 들의 모임
if (max < hm.get(key)) max = hm.get(key);
String tmp = "abc";
for(char x : tmp.toCharArray())
ans.add(max - hm.getOrDefault(x, 0)); // aabb 시, c 가 없기 때문에 getOrDefault
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("aabb"));
}
}
- python
import collections
def solution(s):
answer=[]
sH=collections.Counter(s)
tmp="abc"
maxN=float("-inf")
for x in tmp:
if sH[x]>maxN:
maxN=sH[x]
for x in tmp:
answer.append(maxN-sH[x])
return answer
print(solution("aaabc"))#[0, 2, 2]
print(solution("bbcaabccca"))#[1, 1, 0]
print(solution("caaabccbbccccccaaaaa"))#[1, 6, 0]
print(solution("bbbbbbbbbbbb"))#[12, 0, 12]
print(solution("abc"))#[0, 0, 0]
8) 팰린드롬 길이
- java
import java.io.*;
import java.util.*;
public class Main {
public int solution(String s){
int ans = 0;
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
for(char c : s.toCharArray()) // s 를 문자 배열형으로
hm.put(c, hm.getOrDefault(c, 0) + 1); // 해당 문자가 처음이면 0으로 default
int cnt = 0;
for(char key : hm.keySet()){
if(hm.get(key) % 2 == 0) ans += hm.get(key);
else {
ans += (hm.get(key)-1);
cnt++;
}
}
return cnt > 0 ? ans + 1 : ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("aaaabbbbcccc"));
}
}
- python
function solution(s){
let sH = new Map();
for(let x of s){
sH.set(x, (sH.get(x) || 0)+1);
}
let cnt=0;
for(let val of sH.values()){
if(val%2===1) cnt++;
}
return cnt>0 ? (s.length+1)-cnt : s.length;
}
console.log(solution("abccccdd"));
console.log(solution("ab"));
console.log(solution("bb"));
console.log(solution("ccc"));
console.log(solution("abcde"));
9) 음성 인식
i) abcabcdefabc 에서, abcabcdefbac 일 경우, a,b,c 가 각각의 패턴이 됨 (패턴은 길이가 1이상, 여러개 가능)
ii) ABCabcA 에서, a=3, b=2, b=2 이므로 max인 a 가 말버릇 패턴 -> BCbc 가 답이 됨
- java
import java.io.*;
import java.util.*;
public class Main {
public String solution(String s){
String ans = "";
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
String tmp = s.toLowerCase();
for(char x : tmp.toCharArray())
hm.put(x, hm.getOrDefault(x, 0) + 1);
int max = 0;
for(char key : hm.keySet())
if(hm.get(key) > max) max = hm.get(key);
for(int i = 0; i < s.length(); i++)
if(hm.get(tmp.charAt(i)) < max) ans += s.charAt(i);
// 원본의 s 로 count 해야 대소문자 구분해서 출력됨
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
System.out.println(T.solution("abxdeydeabz"));
}
}
- python
import collections
def solution(call):
answer=""
tmp=call.lower()
sH=collections.defaultdict(int)
maxValue=-1
for x in tmp:
sH[x]+=1
if sH[x]>maxValue:
maxValue=sH[x]
for i, x in enumerate(tmp):
if maxValue>sH[x]:
answer+=call[i]
return answer
print(solution("Abcabcdefabc"))
print(solution("abxdeydeabz"))
print(solution("abcabca"))
print(solution("ABCabcA"))
10) 공통 문자 찾기 (**숙제)
- java
import java.io.*;
import java.util.*;
public class Main {
public ArrayList<Character> solution(String[] words){
ArrayList<Character> answer = new ArrayList<>();
HashMap<Character, Integer> map=new HashMap<>();
for(char x : words[0].toCharArray()){
map.put(x, map.getOrDefault(x, 0)+1);
}
for(int i=1; i<words.length; i++){
HashMap<Character, Integer> tmp=new HashMap<>();
for(char x : words[i].toCharArray()){
if(map.getOrDefault(x, 0)>0){
map.put(x, map.get(x)-1);
tmp.put(x, tmp.getOrDefault(x, 0)+1);
}
}
map=new HashMap<Character, Integer>(tmp);
}
for(char key : map.keySet()){
for(int i=0; i<map.get(key); i++){
answer.add(key);
}
}
return answer;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
String[] tmp = new String[]{"steasue", "sasseysu", "kseseas"};
System.out.println(T.solution(tmp));
String[] tmp1 = new String[]{"longlong", "longtong", "longbig"};
System.out.println(T.solution(tmp1));
}
}
- python
import collections
def solution(words):
answer=[]
words.sort(key=lambda x : len(x))
sH=collections.defaultdict(int)
for x in words[0]:
sH[x]+=1
m=len(words)
for i in range(1, m):
tmp=collections.defaultdict(int)
for x in words[i]:
if sH[x]>0:
sH[x]-=1
tmp[x]+=1
sH=tmp
for [key, val] in sH.items():
for _ in range(val):
answer.append(key)
return answer
print(solution(["a", "aaa", "aaaaa"])) #['a']
print(solution(["longlong", "longtong", "longbig"])) #['l', 'o', 'n', 'g', 'g']
print(solution(["abcde", "edcba", "cdeba", "debac", "acbed"])) #['a', 'c', 'b', 'e', 'd']
print(solution(["cool", "rock", "cook"])) #['c', 'o']
print(solution(["aabbss", "bbbss", "csc", "asb"])) #['s']
11) 가장 가까운 시간
- java
import java.io.*;
import java.util.*;
public class Main {
public int getTime(String time){
String[] tmp = time.split(":"); // 03, 07
int h = Integer.parseInt(tmp[0]); // 3
int m = Integer.parseInt(tmp[1]); // 7
return ((h * 60) + m);
}
public int solution(String[] s){
ArrayList<Integer> tmp = new ArrayList<>();
for(int i=0; i < s.length; i++) tmp.add(getTime(s[i]));
Collections.sort(tmp);
int ans = Integer.MAX_VALUE;
for(int i=1; i < tmp.size(); i++){
int x = tmp.get(i)-tmp.get(i-1);
ans = ans > x ? x : ans;
}
ans = Math.min(ans, 60*24+tmp.get(0) - tmp.get(tmp.size()-1));
return ans;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
String[] tmp = new String[]{"00:12", "00:00", "01:05", "00:57"};
String[] tmp1 = new String[]{"00:00", "23:59", "23:57"};
System.out.println(T.solution(tmp));
}
}
- python
class Solution:
def findMinDifference(self, timePoints: List[str]) -> int:
times = [self.convert(time) for time in timePoints]
times.sort()
res = times[0] + 24*60 - times[-1]
for i in range(1, len(times)):
res = min(res, times[i] - times[i-1])
return res
def convert(self, time):
hour, minutes = time.split(":")
hour = int(hour)
minutes = int(minutes)
return hour*60 + minutes
12) 공부 시간
- java
import java.io.*;
import java.util.*;
public class Main {
public int getTime(String time){
String[] tmp = time.split(":"); // 03, 07
int h = Integer.parseInt(tmp[0]); // 3
int m = Integer.parseInt(tmp[1]); // 7
return ((h * 60) + m);
}
public String solution(String[] s){
String ans = "";
ArrayList<Integer> tmp = new ArrayList<>();
for(int i=0; i < s.length; i++)
tmp.add(getTime(s[i]));
int sum = 0;
for(int i=0; i < tmp.size(); i+=2){
int time = tmp.get(i+1) - tmp.get(i);
if (time >= 5 && time <= 105) sum += time;
else if(time > 105) sum += 105;
}
int h = sum / 60;
int m = sum % 60;
if(h < 10) ans += "0";
return ans + h + ":" + m;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
String[] tmp = new String[]{"08:30", "09:00", "14:00", "16:00", "16:01", "16:06", "16:07", "16:11"};
// String[] tmp1 = new String[]{"00:00", "23:59", "23:57"};
System.out.println(T.solution(tmp));
}
}
2022. 07. 05
다음 시간 : 배열(array) 시뮬레이션
자료구조
정렬 & 그리디
시간복잡도 줄이기
트리, 그래프 탐색 (DFS, BFS)
DFS, BFS 활용
트리, 그래프 알고리즘
728x90