뽀미의 개발노트

인프런 1-1. 문자 찾기 (자바) 본문

Algorithm_Test

인프런 1-1. 문자 찾기 (자바)

산타는 뽀미 2023. 9. 4. 12:59

[문제]

한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요.
대소문자를 구분하지 않습니다.문자열의 길이는 100을 넘지 않습니다.


[입력]

첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다.
문자열은 영어 알파벳으로만 구성되어 있습니다.


[출력]

첫 줄에 해당 문자의 개수를 출력한다.



[문제 풀이 과정]

문자열을 입력받으면 걔의 길이를 바로 알 수 있던가??
아하 쩜 렝스로 길이 바로 알 수 있음!!! 그럼 그 입력받은 문자의 길이만큼
반복문을 돌면서... 두번째 줄에 있는 문자랑 똑같은 애가 나오는지
하나하나 비교해봐야겠다!!
그리고 string이니까 ==으로 비교하면 안되던가? 쩜 이퀄스였던 것 같다.
근데 그럼 맨 처음 입력받았던 문자열에서
문자 하나하나씩 떼어서 배열에 넣어야 하는데.. 그걸 어떻게 하더라
split 이런걸로 하는 거였나?
charAt()이라는 함수로 하나하나 떼어서 배열에 넣어주자!!
근데 그렇게 하려면 반복문을 또 돌려줘야되는데
그냥 toCharArray()라는 함수 사용하면 바로 문자열을 배열로 변환해준다!!

1. 맨 첫줄의 문자열 str을 입력받는다.
2. char[] arr = str.toCharArray();로 배열로 저장한다.
3. 두번째 줄의 문자 char를 입력받는다.
4. arr의 길이만큼 반복문을 돌면서 char와 equal한게 있으면은
answer를 ++해준다.
5. 마지막에 나온 answer를 출력하면 끝!!

여기까지 7분 30초 걸림

처음 낸 코드 오류남. 왜냐하면 대소문자를 구별하지 않는다는
제한 조건을 제대로 안 봤기 때문^^ 하핫
암튼 그래서 그냥 문자열도 다 대문자로 바꿔버리고
문자도 다 대문자로 바꿔서 비교하는 걸로 함!! 대문자로 바꿔버리는 함수는 toUpperCase임. 그랬더니 통과됨...

풀고 통과 받는데 19분 걸림. 개 오래 걸리넹...

[처음 풀어서 통과받은 코드]

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
	    String str = sc.nextLine().toUpperCase(); // 문자열 입력받아서 대문자로 다 바꾸기
	    
	    char[] arr = str.toCharArray(); // 문자열을 배열로
	    
	    char alphabet = sc.next().toUpperCase().charAt(0);
	    // String으로 입력받아서 대문자로 바꾸고 char로 변환
	    
	    int answer = 0;
	    
	    for(int i = 0 ; i < arr.length ; i++) {
	    	if(alphabet==arr[i]) {
	    		answer++;
	    		// 문자열 안의 알파벳과 문자가 똑같으면
	    		// 갯수 하나씩 증가
	    	}
	    }
	    System.out.println(answer);
	}
}

여기서 헷갈려서 찾아봤었던 점은 바로 char는 바로 입력받는 함수가 없어서 일단 next로 String으로 입력받고 .charAt(0)을 이용해서 char로 변환해야 한다는것? 그리고 string은 .equals로 비교해야되지만 char는 ==으로 비교할 수 있다는것? 어휴 이거 인터넷 검색 안 되는 코테에서는 어뜩허냐..?

근데 꼭 처음 입력받은 문자열을 저렇게 배열로 바꿔줄 필요는 없었고, 다른 방식으로 해도 된다. 예를 들어

String str = sc.nextLine().toUpperCase(); // 문자열 입력받아서 대문자로 다 바꾸기
	    
char alphabet = sc.next().toUpperCase().charAt(0);
// String으로 입력받아서 대문자로 바꾸고 char로 변환

for(char x : str.toCharArray()) {
    if(alphabet == x) {
        answer++;
        // 문자열 안의 알파벳과 문자가 똑같으면
        // 갯수 하나씩 증가
    }
}

이런 식으로 향상된 for문 안에서 바로 문자열의 문자를 배열로 바꾼다음에 거기서 하나씩 꺼내서 주어진 알파벳과 비교하는 방법이 있다. 아니면

String str = sc.nextLine().toUpperCase(); // 문자열 입력받아서 대문자로 다 바꾸기
	    
char alphabet = sc.next().toUpperCase().charAt(0);
// String으로 입력받아서 대문자로 바꾸고 char로 변환

for(int i = 0 ; i < str.length() ; i++) {
    if(alphabet==str.charAt(i)) {
        answer++;
        // 문자열 안의 알파벳과 문자가 똑같으면
        // 갯수 하나씩 증가
    }
}

이런 식으로 str을 그때그때 문자열 안의 char로 바꿔서 비교하는 방법이 있다.