33-java - 문자열 심화문제들

jin·2022년 7월 30일
0

1. 단어 검색

  1. 단어를 입력받아 text변수 문장 속에 해당 단어가 있는지 검색한다.
  2. 단어가 존재하면 전부출력한다.
  3. 부분검색도 되어야한다.
    예) ch ==> school , teacher , child

Scanner sc = new Scanner(System.in);

String[] text = {"school" , "teacher" , "child" ,"father" , "love"};
System.out.print("검색할 단어를 입력하세요 : ");
String word = sc.nextLine();
String search = "";


for (int i = 0 ; i < text.length; i++) {
	boolean check = false;
	int index = 0;
	for (int j = 0; j < text[i].length(); j++) {
		char chText = text[i].charAt(j);
		char chWord = word.charAt(index);
		
		if (chText == chWord) {
			index++;
		} else {
			index = 0;
		}
		
		if (index == word.length()) {
			check = true;
			break;
		}
		
	}
	if (check == true) {
		search += text[i] + ",";
	}
}
if (search.equals("")) {
	System.out.println("검색 포함 단어 없음");
} else {
	System.out.println( search.substring(0,search.length()-1) );
}

sc.close();

앞서 배열에서 했던 연속된 숫자 판별 응용문제

2. 단어교체 문제

단어 교체하기(replace)
1. text변수 문장 속에서 변경하고 싶은 단어를 입력받아,
2. 교체해주는 기능을 구현한다.
예)
Life is too short.
변경하고 싶은 단어입력 : Life
바꿀 단어입력 : Time
Time is too short.

Scanner sc = new Scanner(System.in);
String text = "Life is too short.";
System.out.println(text);

System.out.print("변경하고 싶은 단어를 입력하세요 : ");
String word = sc.nextLine();
String front = "";
String end = "";
int size = text.length() - word.length()+1;

boolean check = false;

for (int i = 0; i < size; i++) {
	int count = 0;
	for (int j = 0; j < word.length(); j++) {
		if (text.charAt(i + j) == word.charAt(j)) {
			count++;
		}
	}
	if (count == word.length()) {
		front = text.substring(0,i);
		end = text.substring(i + word.length());
		check = true;
	} 
}
if (check == true) {
	System.out.print("삽입할 단어 입력 : ");
	String change = sc.next();
	System.out.println(front + change + end);
} else {
	System.out.println("해당 단어 없음 " + word);
}

입력한 문자열이 있는지 먼저 확인 해 준 후, 그 앞의 문자열(frontn)와 뒤쪽 문자열(back)을 구해 마지막에 합쳐주면 된다.
어려웠다. 하다가 접근법 자체를 틀려서 망하기도 했고 변수를 덜써보겠다고 진행하다가 입력한 문자가 삽입되어 나오는 등 애로사항이 많았다.

3. 문자열 속 숫자검사

문자열 속 숫자검사
예) adklajsiod
문자만 있다.
예) 123123
숫자만 있다.
예) dasd12312asd
문자와 숫자가 섞여있다.

Scanner sc = new Scanner(System.in);
System.out.print("입력 : ");
String text = "adklajsiod";
//		String text = sc.next();
System.out.println(text);
boolean check = false;
int count = 0;
for (int i = 0; i < text.length(); i++) {
	if (text.charAt(i) <= '9' && text.charAt(i) >= '0') {
		check = true;
		System.out.println("i번째 : " + (i+1) + " / "+ (text.charAt(i)) );
		count++;
	}
}
if (check == true) {
	System.out.println(text);
	if (count == text.length()) {
		System.out.println("숫자만 있다");
	} else {
		System.out.println("문자와 숫자가 섞여있다");
	}
} else {
	System.out.println(text);
	System.out.println("문자만 있다");
}

바로 앞의 포스팅 대소문자 일치에서 숫자 판별할때는 for문으로 각 문자에 숫자가 있는지 각기 판별해줬다면 이러한 조건식으로 각 단어에 대한 숫자 확인 반복을 하지 않고 판별이 가능해진다.

4. 타자연습 게임[2단계]

타자연습 게임[2단계]
1. 문제를 섞는다.(shuffle)
2. 순서대로 문제를 출제하고, 문제를 다 맞추면 게임 종료
3. 단 문제를 출제할 때, 단어의 랜덤한 위치 한 곳만 로 출력
예)
문제 : mys
l
입력 : mysql <--- 정답을 맞추면, 다음 문제 제시
문제 : *sp
입력 : jsp
...

Random rnd = new Random();
Scanner sc = new Scanner(System.in);
String[] words = {"java", "mysql", "jsp", "spring"};

for (int i = 0; i < 50; i++) {
	int rNum1 = rnd.nextInt(4);
	int rNum2 = rnd.nextInt(4);
	String temp = words[rNum1];
	
	words[rNum1] = words[rNum2];
	words[rNum2] = temp;
	
}
System.out.println(Arrays.toString(words));
int count = 0;
boolean run = true;
String temp = null;
while (true) {
	if (count == words.length) {
		System.out.println("\n전체 정답. 클리어 \n종료");
		break;
	}
	int size = words[count].length();
	int rNum = rnd.nextInt(size);
	while (run) {
		String rChar = words[count].charAt(rNum) + "";
		temp = words[count].replaceFirst(rChar, "*");
		run = false;
	}
	System.out.printf("문제 : %s \n", temp);
	System.out.print("입력 : ");
	String answer = sc.next();
	if (words[count].equals(answer)) {
		System.out.println("정답");
		run = true;
		count++;
	} else {
		System.out.println("오답");
	}
	
}

앞서 배열 문제에서 다 풀고 이해하고 넘어왔다면 크게 어려움이 없을 문제 각 순서에 따라 한글자씩 가려주고 정답 수와 words배열의 크기가 같아질때까지 진행하면 된다.

5. 영어단어 맞추기

영어단어가 전부 * 로 표시된다.
영어단어를 입력받고 틀릴때마다 랜덤으로 한글자씩 벗겨진다. (점수는 5점씩 감점)
(조건) 만약에 같은 철자가 여러개면 한번에 벗겨진다.
전부 벗겨지거나 맞추면 종료

Scanner sc = new Scanner(System.in);
Random rnd = new Random();

String word = "performance";
String meaning = "공연";
int size = word.length();
int score = 100;
int check[] = new int[size]; // 힌트 - 체크를 통해서 확인할수있다.
System.out.println(Arrays.toString(check));
int count = 0;
String answer ="";
while (true) {
	if (score != 100) {
		int rNum = 0; // 중복검사
		while (true) {
			rNum = rnd.nextInt(size);
			if (check[rNum] == 0) {
				break;
			} else {
				continue;
			}
		}
		char rChar = word.charAt(rNum);
		for (int i = 0; i < size; i++) {
			if ((int)rChar == (int)word.charAt(i)) {
				check[i] = (int)rChar;
				count++;
			}
		}
	}
	if (count >= size) { 
		System.out.println("* 전부 오픈");
		System.out.println("정답은 " + word);
		break;
	}
	System.out.println("뜻 : " + meaning);
	System.out.print("문제 : ");
	for (int i = 0; i < size; i++) {
		if (score != 100) {
			if (check[i] == (int)word.charAt(i)) {
				System.out.print(word.charAt(i));
			} else {
				System.out.print("*");
			}
		} else {
			System.out.print("*");
		}
	}
	System.out.println();
	System.out.print("답 : ");
	answer = sc.next();
	
	if (word.equals(answer)) {
		System.out.println("정답");
		System.out.println("점수 : " + score);
		break;
	} else {
		System.out.println("오답\n");
		score -= 5;
		
	}
}

문제는 이해했으나 주어진 힌트에서 방향성을 잘못잡아 약간 애로사항이 꽃필듯 말듯 했던 문제.
check배열에 인덱스를 넣어주면 됐었는데 parseInt로 글자 아스키코드 값을 넣어줬다. 결국적으로 그것도 0이 아니니 맞긴 했다.

6. 쇼핑몰 [장바구니]

  1. 로그인 후 쇼핑 메뉴를 선택하면, 다음과 같이 상품목록을 보여준다.
    (1) 사과 (2) 바나나 (3) 딸기
  2. 번호를 선택해 상품을 장바구니에 담을 수 있다.
  3. 로그인 회원아이디 는 각 행의 첫번째 열에 저장한다.
  4. 해당 회원이 구매한 상품은 각 행의 두번째 열에 저장한다.
    예)
    {
    {qwer, 사과},
    {javaking, 바나나},
    {abcd, 사과},
    {qwer, 딸기},
    {qwer, 사과},
    ...
    }
  5. 장바구니 메뉴를 선택하면 자기가 산 물품만 보이도록한다.
    예) qwer ==> 사과 , 딸기 , 사과
Scanner sc = new Scanner(System.in);

String[] idList = {"qwer", "javaking", "abcd"};
String[] pwdList = {"1111",     "2222", "3333"};

int MAX_SIZE = 100;
String[][] cartList = new String[MAX_SIZE][2];

int count = 0;

String[] items = {"사과", "바나나", "딸기"};

String log = "";
int index = -1;
while(true) {
	boolean check = false;
	System.out.println("[MEGA MART]");
	if (log.isEmpty()) {
		System.out.println("[1]로 그 인");
	} else {
		System.out.println(log+"회원 로그인 중");
		System.out.println("[2]로그아웃");
		System.out.println("[3]쇼     핑");
		System.out.println("[4]장바구니");
	}
	System.out.println("[0]종     료");
	
	System.out.print("메뉴 선택 : ");
	int select = sc.nextInt();
	if(select == 1) {
		if (log.isEmpty()) {
			System.out.print("아이디 입력 : ");
			String id = sc.next();
			for (int i = 0; i < idList.length; i++) {
				if (id.equals(idList[i])) {
					System.out.print("비밀번호 입력 : ");
					String pwd = sc.next();
					if (pwd.equals(pwdList[i])) {
						System.out.println("로그인 성공\n");
						log = idList[i];
						index = i;
						check = true;
						break;
					} else {
						System.out.println("비밀번호 오류\n");
						break;
					}
				} 
			}
		} else {
			System.out.println("로그아웃 후 이용 가능\n");
		}
		if (log.isEmpty()) {
			System.out.println("아이디 또는 비밀번호 확인\n");
		}
	}
	else if(select == 2) {
		if (!log.isEmpty()) {
			log = "";
			index = -1;
			System.out.println("로그아웃 성공\n");
		} else {
			System.out.println("로그인 후 이용가능\n");
		}
	}
	else if(select == 3) {
		System.out.println(Arrays.toString(items));
		System.out.print("구매할 과일 입력 : ");
		String item = sc.next();
		for (int i = 0; i < items.length; i++) {
			if (item.equals(items[i])) {
				System.out.println("구매성공\n");
				cartList[count][0] = log;
				cartList[count][1] = items[i];
				count++;
				check = true;
				break;
			}
		}
		if (check == false) {
			System.out.println("해당 과일 없음\n");
		}
	}
	else if(select == 4) {
		System.out.println(log + "==>");
		for (int i = 0; i < cartList.length; i++) {
			if (log.equals(cartList[i][0])) {
				System.out.print(cartList[i][1] + " ");
			}
			if (cartList[i][0] == null) {
				break;
			}
		}
	}
	else if(select == 0) {
		System.out.println("프로그램 종료");
		break;
	}		
}

배열에서 회원가입 문제를 스스로 해냈다면 크게 어려울 것이 없는 문제

0개의 댓글