본문 바로가기
Study/코딩개념 잡는 자바 코딩 문제집

1.문자 개수 세기

by prlkt5200 2024. 9. 23.
반응형

문자 개수를 세는 예제를 분석해봤습니다. 

간단한데, 공부가 부족해서 그런가 이것조차도 어려웠습니다.

이를 반성해서 조금 더 분발해야겠습니다.

 

1번 풀이

	//이 메소드는 charcacter를 키로 하고, integer를 값으로 가지는 map을 반환받습니다.
	//그리고 메소드명은 중복 문자를 카운트 한다는 의미입니다.
	public Map<Character, Integer> countDuplicateCharacters(String str) {
		
		//맵타입의 해쉬맵 객체를 생성합니다.
		Map<Character, Integer> result = new HashMap<>();

		//문자열의 길이만큼 반복문을 돌려줄 것입니다.
		for (int i = 0; i < str.length(); i++) {
			//문자열의 특정인덱스의 문자를 반환받고 다시 char 변수에 저장해줍니다.
			char ch = str.charAt(i);

			
			//여기서 맵 객체의 compute 메소드와 람다식을 활용해줄 것입니다.
			//상세히 설명하면, ch는 현재 처리할 문자를 의미합니다.
			//그리고 k는 처리할 문자인 ch를 의미하며, v는 카운트를 의미하는 값입니다.
			//람다식에서는 다음과 같이 동작합니다. 
			//k(ch)가 맵 객체에 존재하지 않는다면 자연스럽게 v는 null이 되고 삼항 연산자에 따라서
			//v에 1이 저장됩니다. 그리고 기존에 값이 있다면 v는 카운트가 추가될 것입니다.
		
			result.compute(ch, (k, v) -> (v == null) ? 1 : ++v);
		}
		return result;
	}

 

2번 풀이

이 풀이는 교재 내용을 분석한 것이고, 그럼에도 제가 이해가 가지를 않아서 챗gpt를 이용해서 다시 해석해봤습니다.
사실상 챗gpt가 다하였지만, 그래도 도움이 많이 되었습니다.

	//맵 타입을 반환받는 메소드입니다.
	public Map<Character, Long> countDuplicateCharacters(String str) {
		//str.chars()로 int스트림을 반환받고, 다시 mapToObj로 문자스트림을 반환받습니다.
		Map<Character, Long> result = str.chars().mapToObj(c -> (char) c)
				//그리고 그것을 다 끝내고 그룹핑한 뒤에는 숫자를 카운팅해주는 게 매커니즘입니다.
				.collect(Collectors.groupingBy(c -> c, Collectors.counting()));
		return result;
	}

 

 

str.chars():

  • 문자열 str을 스트림으로 변환합니다. 이 메소드는 문자열을 IntStream으로 변환하여 각 문자의 유니코드 값을 스트림 형태로 제공합니다.

.mapToObj(c -> (char) c):

  • IntStream의 각 정수(문자의 유니코드 값)를 Character 객체로 변환합니다. 즉, 각 문자로 매핑됩니다

.collect(...):

  • 스트림의 요소를 수집하여 맵 형태로 변환합니다.

Collectors.groupingBy(c -> c, Collectors.counting()):

  • groupingBy는 주어진 키 함수(여기서는 각 문자)로 요소를 그룹화합니다.
  • 각 그룹에 대해 Collectors.counting()을 사용하여 해당 그룹의 요소 수를 셉니다.
  • 이 결과로 각 문자가 키, 그 문자의 출현 횟수가 값인 맵이 생성됩니다.

전체적인 흐름

  1. 문자열을 스트림으로 변환합니다.
  2. 각 문자를 Character 객체로 변환합니다.
  3. 각 문자를 기준으로 그룹화하여 출현 횟수를 셉니다.
  4. 최종 결과를 반환합니다.
반응형