감 잃지말고 개발하기

[프로그래머스] [JAVA] [Level 1] 가장 가까운 동일 문자 찾기 본문

프로그래머스/JAVA

[프로그래머스] [JAVA] [Level 1] 가장 가까운 동일 문자 찾기

persii 2022. 12. 23. 00:16

문제

문자열 s가 주어졌을 때, 

s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.


예를 들어 s="banana"라고 할 때, 

각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

 

  • b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
  • n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
  • a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

 

입출력 예

"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]

 

접근방법

1. 글자 하나하나에 접근하기 위해 for문 사용

    

2. 글자 하나의 값을 가져오기 위해 String 클래스의 charAt() 사용

 

3. 글자 하나의 위치(인덱스)를 가져오기 위해 String 클래스의 lastIndexOf() 사용

 

 

해결

public class FindClosestLetter {
	
	public void solution() {
	
		Scanner sc = new Scanner(System.in);
		
		System.out.print("단어를 입력하세요 >> ");
		String s = sc.nextLine();
		
		int[] answer = new int[s.length()];

		for(int i=0; i<s.length(); i++) {
        		int pos = s.lastIndexOf(s.charAt(i), i-1);
			if(pos != -1) {
				answer[i] = i - pos;
			} else {
				answer[i] = pos;
			}
		}
		
		for(int i : answer) {
			System.out.println(i);
		}
	}
}

 추가 설명 

1. indexOf() / lastIndexOf()

 String에서 특정 문자열의 인덱스를 찾는데 사용하는 메소드이다.

  • → indexOf
  • indexOf(String s) - 인자로 전달된 s의 인덱스 리턴
  • indexOf(String s, int fromIndex) - fromIndex번 인덱스에서([fromIndex])부터 s를 찾아 그 첫번째 인덱스를 리턴  
  • indexOf(int i) - int 타입으로 전달된 아스키 값을 문자열에서 찾아 그 인덱스를 리턴
  • indexOf(int i, int fromIndex) - 첫번째 인자는 찾고자 하는 아스키 값, 두번째 인자는 탐색을 시작할 인덱스를 의미
  • lastIndexOf ←
  • lastIndexOf(String s) - 문자열 맨 끝에서부터 s를 찾아 그 인덱스를 리턴
  • lastIndexOf(String s, int fromIndex) - fromIndex번 인덱스에서부터 시작, 왼쪽으로 탐색하면서 s를 찾아 그 첫번째 인텍스를 리턴
  • lastIndexOf(int i) - 맨끝에서부터 아스키 코드값을 찾아 그 인덱스를 리턴
  • lastIndexOf(int i, int fromIndex)
String string = "Hello World";
		
System.out.println(string.indexOf('o'));		// 4
System.out.println(string.indexOf('o', 5));		// 7

System.out.println(string.lastIndexOf('o'));	// 7
System.out.println(string.lastIndexOf('o', 5));	// 4

 

indexOf() / lastIndexOf() 의 첫번째 인자가 int형일 때, 아스키 코드를 활용! → char형!

String s = "Hello World";

for(int i=0; i<s.length(); i++) {
	System.out.println(s.lastIndexOf(s.charAt(i), i-1));
	System.out.println(s.lastIndexOf(s.substring(i, i+1), i-1));
}

결과는 서로 동일하다!

 

2. charAt()

String 타입의 데이터(문자열)에서 특정 문자를 char 타입으로 변환할 때 사용하는 함수.

System.out.println(s.charAt(0));	// H
System.out.println(s.charAt(4));	// o