728x90
String(문자열) 섹션 - (3)
1-9. 숫자만 추출 | 아스키 번호로 구분 후 (1) answer 누적 or (2) isDigit() 구분 후 형변환
* 1-9.숫자만 추출
*
* 문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.
* 만약 “tge0a1h205er”에서 숫자만 추출하면 0, 1, 2, 0, 5이고 이것을 자연수를 만들면 1205이 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.
( 즉, 첫 0 은 무시함)
// 1)문자, 숫자 식별 -> 아스키 번호로 구분
* 문자형 숫자 는'0': 48 <= x <= '9' : 57 가진다.
2) 숫자만 이어붙이고
방식 1)
answer = answer * 10 + (x - 48) 로 이어붙임
방식 2)
String 상태에서 isDigit()으로 구분한 뒤 이어붙인 문자열 parseInt로 형변환시킴
3) 리턴
* */
public class Main1 {
//솔루션 함수 -(1)
public int solution(String str) {
int answer = 0;
for(char x : str.toCharArray()) {
if(x >= 48 && x <= 57) answer = answer * 10 + (x- 48);//실제 숫자로 교환됨
}
return answer;
}
//솔루션 함수 -(2)
public int solution2(String str) {
String answer = "";
for(char x: str.toCharArray()) { //단순 문자로 취급하므로 첫 시작 0 은 제거해줘야 함
if(Character.isDigit(x)) {
answer += x;
}
}
return Integer.parseInt(answer) ; // 0208 -> 숫자 208이 된다.
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main1 T = new Main1();
Scanner kb = new Scanner(System.in);
//1) 입력 문자열
String str = kb.next();
//2) 출력 (1)
System.out.println(T.solution(str));
//3) 출력 (2)
System.out.println(T.solution2(str));
}
}
1-10. 가장 짧은 문자거리(최소거리)
/*
* 1-10. 가장 짧은 문자거리
* 한 개의 문자열 s와 문자 t가 주어지면,
* 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.
* 예를 들어,
* s: teachermode t : e
* [양쪽 모두에 e 가 존재하는데 이 경우 최소거리 구하는 법]
* 1) 왼쪽 e 기준의 거리
* 2) 오른쪽 e 기준의 거리
* 3) 둘 중 작은 값 = 최소거리 로 세팅한 최종 answer 배열 반환하면 됨
* */
public class Main2 {
//솔루션 함수
public int[] solution(String s, char t) {
int[] answer = new int[s.length()];
int p = 1000; // 측정용 변수
//1) 왼쪽 e 기준 거리
for(int i = 0; i<s.length(); i++) {
if(s.charAt(i) == t) { //타겟 문자인 경우 0 세팅
p = 0;
answer[i] = p;
}else { //본인 아닌 경우
p++; //측정 p 증가시키면서
answer[i] = p; //정답지에 세팅
}
}
//2) 오른쪽 e 기준 거리 | 거꾸로 돌려서 측정
p = 1000;
for(int i = s.length()-1; i>=0; i--) {
if(s.charAt(i) == t) {
p = 0;
}else {
p++;
// *** answer[]는 min()으로 비교 (기존값 vs 현 P) 중 더 작은값으로 세팅 ****
answer[i] = Math.min(answer[i], p);
}
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Aut o-generated method stub
Main2 T = new Main2();
Scanner kb = new Scanner(System.in);
// 1) 입력
String s = kb.next();
char t = kb.next().charAt(0);
// 2) 출력
for(int x: T.solution(s, t)) {
System.out.print(x+" ");
}
}
}
1-11. 문자열 압축
/*
* 1-11. 문자열 압축
* 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
cnt = 반복횟수 카운팅 변수
배열로 받아서 각 문자 i, i+1 지칭하는 애가 1) 같은 문자인 경우, cnt++
2) 다른 문자인 경우, 반복 끝났으니 반환
answer에 [현 i 지칭 문자 + cnt(반복횟수)] 이어 붙이기
다시 cnt = 1 재세팅
* */
public class Main3 {
public String solution(String s) {
String answer = "";
s += " "; //뒤에 빈 문자 하나 덧붙여줄 것 (왜냐면 다를 때만 현 문자 출력하니까)
int cnt = 1; //최소 1번은 반복되니
for(int i = 0; i<s.length()-1; i++) {
if(s.charAt(i) == s.charAt(i+1)) cnt++;
else {
answer += s.charAt(i);
if(cnt > 1) { //반복 횟수 1은 생략하므로
answer += String.valueOf(cnt);
cnt = 1;//다시 초기화
}
}
}
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main3 T = new Main3();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}
1-12. 암호 해독 문제
/* 1-12. 암호
* 비밀 편지 해독 문제
[입력]
첫 줄에는 보낸 문자의 개수(10을 넘지 안습니다)가 입력된다.
다음 줄에는 문자의 개수의 일곱 배 만큼의 #또는 * 신호가 입력됩니다.
현수는 항상 대문자로 해석할 수 있는 신호를 보낸다고 가정합니다.
[출력]
영희가 해석한 문자열을 출력합니다.
// 암호는 7개 단위로 하나의 대문자 대체 O
1) 암호 -> 2진수 (#=1, *=0) 로 바꾸고
2) 2진수 -> 10진수 변환
3) 아스키 번호 기준으로 10진수 -> 65 문자로 변환시킴 (최종 해석문)
//받은 문자열을
* -> 7개 단위로 잘라서 subString() 끊어 읽고. -> 2진수 replace() 하고
* -> 10진수로 변형하고 -> 아스키에 맞게 문자 변형
*/
public class Main4 {
//솔루션 함수
public String solution(int n, String s) {
String answer = "";
for(int i = 0; i<n; i++) {
//(1) 7개 단위로 뽑고 # = 1, * = 0 변형시킴
String tmp = s.substring(0, 7).replace('#', '1').replace('*', '0');
//(2) tmp(String형태) 2진수 를 10진수 num으로 변형
int num = Integer.parseInt(tmp, 2);
//(3) num을 char 강제 형변환 시킨 뒤 answer에 이어붙임
answer += (char) num;
// 뽑고 난 뒷 내용물은 보존시킴
s = s.substring(7);
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main4 T = new Main4();
Scanner kb= new Scanner(System.in);
//1) 입력
int n = kb.nextInt();
String s = kb.next();
//2) 출력
System.out.println(T.solution(n, s));
}
}
728x90
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 1' 카테고리의 다른 글
배열(Array) 섹션 - (3) (0) | 2023.03.01 |
---|---|
배열(Array) 섹션 - (2) (0) | 2023.02.28 |
배열(Array) 섹션 - (1) (0) | 2023.02.27 |
String(문자열) 섹션 - (2) (0) | 2023.02.22 |
String(문자열) 섹션 - (1) (0) | 2023.02.21 |