| 인프런에서 코딩테스트 강의를 하나 찾아 듣는중.. 코딩테스트 말만 들었지 막상 하려니까 제일 쉬운 문제도 어떻게 해야할 지 모르겠어서 일단 코딩테스트 강의를 들으면서 그 강의에 나온 JAVA이론들 싹다 다시 정리하고 아예 문제 자체를 외워버릴 각오로 블로그에 기록한다. 코딩테스트 강의를 듣고 실력이 늘면 프로그래머스에서 스스로 코딩테스트를 해볼 수 있는 힘이 생기겠지... 먼저 제일 쉬운 문자 찾기 부터 강의를 듣는데.. 오.. 자바 배운것 같은데.. 하나도 모르겠는게 내 실력이 얼마나 미천한지 실감이 된다... 열심히 해야지.. |
1. 문자찾기
설명
한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요.
대소문자를 구분하지 않습니다.문자열의 길이는 100을 넘지 않습니다.
입력
첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다.
문자열은 영어 알파벳으로만 구성되어 있습니다.
출력
첫 줄에 해당 문자의 개수를 출력한다.
예시 입력 1
Computercooler
c
예시 출력 1
2
알고 넘어가야 할 이론 :
1. Scaner:
스캐너 클래스는 키보드로 입력받을때 사용할 수 있다.
스캐너 클래스의 특징 :
1. 기본적인 데이터 타입들을 Scaner 클래스의 메소드를 사용하여 입력받을 수 있다.
이때 사용하는 메소드는 아래와 같다.
| next() | String을 읽음. 단, 띄어쓰기 뒷부분은 읽지 않음. |
| nextLine() | String을 읽음. 띄어쓰기를 포함하여 한 줄(즉, Enter를 치기 전까지)을 읽음. |
| nextInt() | int 를 읽음. |
| nextBoolean() | boolean 을 읽음 |
| nextByte() | byte 를 읽음 |
| nextShort() | short 를 읽음 |
| nextLong() | long 을 읽음 |
| nextFloat() | float 을 읽음 |
| nextDouble() | double 을 읽음 |
2, Scaner 클래스를 사용할 때 urile 패키지를 경로의 Scanner 클래스를 호출해야 한다.
자바에서 쓰이는 대부분의 클래스는 lang 패키지가 아니라면 import를 통해 호출해주어야 한다.
Scanner의 경우는 java.util 패키지에 있다.
3. 공백(띄어쓰기) 또는 개행(줄 바꿈)을 기준으로 읽는다.
Scanner의 입력 메소드들은 대부분 공백과 개행(' ','\t','\r','\n' 등등..)을 기준으로 읽는다. 이 덕분에 사용자의 편의에 따라 쉽게 입력을 받을 수 있다.
Scanner 객체를 생성할 때
Scanner in = new Scanner(System.in); // Scanner 객체 생성
으로 생성하는데. 이때 들어가는 System.in 은 사용자로부터 입력을 받기위한 입력 스트림이다.
따라서 다른 입력 방식들도 사용자로부터 입력을 받기 위해서는 대부분 System.in 이 들어간다.
※ 참고 블로그
https://st-lab.tistory.com/92
자바 [JAVA] - 스캐너(Scanner) 클래스와 입력
자바를 처음 배울 때 아마 대부분은 키보드로 입력받기 위해 Scanner 라는 클래스를 썼을 것이다. 자바 외에도 다양한 언어들은 각각의 입력방식이 있고, 각 언어별로 대표하는 대중적인 입력방식
st-lab.tistory.com
2. toUpperCase():
대상 문자열을 모두 대문자로 변환해주는 메서드.
반대로 toLowerCase() 가 있다. 이건 모두 소문자로 바꿔주는 메서드.
사용방법 :
문자열.toUpperCase();
3. charAt():
Scanner 은 char 타입으로 입력받을 수 없고 무조건 String 타입으로 입력받는다.
따라서 문자 딱 한글자만 골라내기가 매우 어렵다.
charAt() 메서드는 그런점을 보완해준다.
String 타입으로 저장된 문자열을 char 타입의 배열로 바꿔주는 메서드이다.
사용방법은 아래와 같다.
str.charAt();
str.charAt(1);
// str.charAt(1) 의 의미는 스트링 문자열중 2번째에 있는 문자를 char 타입으로 바꿔주겠다~~~
문제 풀이:
import java.util.Scanner;
public class Main {
public int solution(String str, char t){
// Main 클래스에 solution 이라는 메서드를 하나 만들어준다.
// 이 메서드는 문자열 타입을 가진 데이터 srt 와 char 타입의 문자 하나인 t를 받는다.
int answer = 0;
// answer 값을 리턴하는데, answer은 int 타입이며, 초기값은 0이다.
str = str.toUpperCase();
// 받아온 String 타입의 데이터 str 을 모두 대문자로 바꾸어준다.
// str 클래스 안에 있는 toUpperCase() 메서드를 사용한다.
// 왜냐하면 문제에서 대소문자를 구분하지 않는다 했으니까, 모두 대문자로 바꿔버리면 대소문자 구분하지 않아도 됨.
t = Character.toUpperCase(t);
//char 타입은 문자 하나이기 때문에, Character 클래스에서 가져와야 한다.
System.out.println(str + " " + t);
// 대소문자가 잘 바뀌었는지 확인해봄. 흠... 잘 바뀌고 있군 ㅇㅇ
for(int i=0; i<str.length();i++){
//int i가 0이고 i가 str의 길이보다 작을때 i가 하나씩 증가하는 반복문을 돌리겠다~~
if(str.charAt(i) == t){ answer++;
//만약에 str 안에 문자 하나하나의 배열인덱스로 i를 넣어서 하나하나 지정해주는데, 이때 t와 같다면 answer 값을 하나씩 증가시키겠다~~
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
//Main 클래스를 T라고 하는 새로운 객체를 생성해준다.
Scanner kb = new Scanner(System.in);
// Scanner 클래스를 이용해서 사용자가 입력한 값을 입력받아 kb변수에 넣어준다.
String str = kb.next();
//kb로 입력받은 값을 next메소드를 이용해 스트링값으로 읽어서 str 변수에 넣어준다.
char c = kb.next().charAt(0);
//charAt() 메소드는 next()메소드에서 입력받은 스트링을 배열로 변환해주는 메서드이다.
//즉,입력받은 값의 문자열의 첫번째 글자를 c변수에 넣어주어라~~ 라는 코드이다.
System.out.println(T.solution(str, c));
}
}
향상된 for문을 활용한 문제풀이 :
import java.util.Scanner;
public class Main {
public int solution(String str, char t){
// Main 클래스에 solution 이라는 메서드를 하나 만들어준다.
// 이 메서드는 문자열 타입을 가진 데이터 srt 와 char 타입의 문자 하나인 t를 받는다.
int answer = 0;
// answer 값을 리턴하는데, answer은 int 타입이며, 초기값은 0이다.
str = str.toUpperCase();
// 받아온 String 타입의 데이터 str 을 모두 대문자로 바꾸어준다.
// str 클래스 안에 있는 toUpperCase() 메서드를 사용한다.
// 왜냐하면 문제에서 대소문자를 구분하지 않는다 했으니까, 모두 대문자로 바꿔버리면 대소문자 구분하지 않아도 됨.
t = Character.toUpperCase(t);
//char 타입은 문자 하나이기 때문에, Character 클래스에서 가져와야 한다.
System.out.println(str + " " + t);
// 대소문자가 잘 바뀌었는지 확인해봄. 흠... 잘 바뀌고 있군 ㅇㅇ
for(char x : str.toCharArray()){
//toCharArray()은 스트링의 문자를 하나하나 분리해서 새로운 배열을 만들어주는 메서드이다.
//String 문자열이 배열로 변경되고, 그 문자 하나하나가 x와 대응된다.
if(x==t){
answer++;
//만약 배열을 하나하나 분리해서 x와 대응했던 것이 t와 같다면 answer이 하나씩 증가한다.
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
//Main 클래스를 T라고 하는 새로운 객체를 생성해준다.
Scanner kb = new Scanner(System.in);
// Scanner 클래스를 이용해서 사용자가 입력한 값을 입력받아 kb변수에 넣어준다.
String str = kb.next();
//kb로 입력받은 값을 next메소드를 이용해 스트링값으로 읽어서 str 변수에 넣어준다.
char c = kb.next().charAt(0);
//charAt() 메소드는 next()메소드에서 입력받은 스트링을 배열로 변환해주는 메서드이다.
//즉,입력받은 값의 문자열의 첫번째 글자를 c변수에 넣어주어라~~ 라는 코드이다.
System.out.println(T.solution(str, c));
}
}
뜯어먹는 문제분석 :
1. 문자찾기
설명
한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내는 프로그램을 작성하세요.
// 이 문장으로 알수있는 정보는 메서드에 문자열(String)과 특정문자(char)의 데이터 값을 사용자로부터 입력받아서 몇개(int)로 리턴한다는 것을 알 수 있다.
// 사용자로부터 입력받겠다는 것은 즉, Scanner 클래스를 사용하겠다는 것을 유추해낼 수 있어야 한다.
//입력받은 문자열"에서" 특정 문자를 뽑아내야 하니 문자열배열로 바꿔주는 charAt() 메서드가 사용되었을 것이고,
입력받은 문자가 문자열에 몇개 존재하는지 알아내기 위해서 for문으로 배열을 돌려주면서 그 안의 하나하나의 문자를 비교하는 if문이 들어가야 할 것이다.
대소문자를 구분하지 않습니다.문자열의 길이는 100을 넘지 않습니다.
//대소문자를 구분하지 않으니 데이터 받는 데이터값들을 toUpperCase()나 toLowerCase()로 변환해 주어야 한다.
입력
첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다.
문자열은 영어 알파벳으로만 구성되어 있습니다.
출력
첫 줄에 해당 문자의 개수를 출력한다.
예시 입력 1
Computercooler
c
예시 출력 1
2
문제 감상 :
굉장히 간단한 문제여도 조각조각 개념이 굉장히 많이 필요한 것 같다. 결국 얼마나 기억하고 있는가의 문제인가..
문제를 읽고 해석하는 능력도 중요할 것 같다.
풀어 쓴 문제를 코드로 어떻게 대응해서 생각해 낼 수 있는지가 관건이 될듯하다.
뭐.. 첫걸음은 힘겨워도 하다보면 늘겠지 뭐.. 하루이틀만 하고 그만둘 거 아니니까...
그냥 포기만 하지 않고 꾸준히 하다보면 어떻게든 되지 않을까... 생각이 드는 첫 문제였다.
내일 또 다른 문제도 분석해야지...!
'Practice > 알고리즘' 카테고리의 다른 글
| 파이썬 알고리즘: K번째 큰 수 구하기. (0) | 2022.11.14 |
|---|---|
| 파이썬 알고리즘: K번째 수 구하기 (0) | 2022.11.11 |
| 파이썬 알고리즘 : K번째 약수 구하기. (1) | 2022.11.10 |
| CodingTest_ch.01_03 (문장 속 단어) (0) | 2022.09.30 |
| CodingTest_ch.01_02 (대소문자 변환) (0) | 2022.09.29 |