송민준의 개발노트

프로그래머스-level1-문자열 내 마음대로 정렬하기 본문

알고리즘/프로그래머스

프로그래머스-level1-문자열 내 마음대로 정렬하기

송민준 2019. 11. 9. 14:52

https://programmers.co.kr/learn/courses/30/lessons/12915

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기 | 프로그래머스

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1의 문자 u, e, a로 strings를 정렬합니다. 제한 조건 strings는 길이 1 이상, 50이하인 배열입니다. strings의 원소는 소문자 알파벳으로 이루어져 있습니다. strings의 원소는 길이 1 이상, 100이하인

programmers.co.kr

생각보다 시간을 많이 잡아먹은 문제...

처음에 문제 딱 보고 TreeMap 써서 키값으로 인덱스 n으로 추출한 값을 넣고 value로 string값을 넣으면 되겠다 생각했음.

 

1번은 패스가 되나 2번(키값 중복)이 문제가 됨.

TreeMap은 키값을 정렬을 해줘서 아주 유용하지만 key값이 중복이 안된다는거(너무 당연하지만...ㅋㅋ)

중복이 된다는거 자체가 key로서 역할을 못해주기 때문에  value에다가 넣어야 하나 생각을 해봤지만

정렬의 장점을 못살리기 때문에 탈락.

 

그래서 ArrayList를 사용해서 람다식으로 풀고자 했으나 인덱스 구분에 막혀 그냥 for문으로 돌림 ㅠㅠ

아쉬워서 출력이라도 람다식으로 구현해 봤음...

 

풀이 순서

1. 받은 배열을 정렬(추출한 값이 중복이면 순서대로 출력해야 하니까)

2. ArrayList에 추출한 문자 입력

3. ArrayList 정렬

4. 추출한 문자와 완전한 무자에서 추출한 숫자가 같은 경우에 또다른 arrayList에 추가해줌

5. 추가해준 arrayList를 배열로 바꿔 리턴해줌

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
class Solution {
  public String[] solution(String[] strings, int n) {
         ArrayList<String> ans = new ArrayList<String>();
		 ArrayList<String> answer = new ArrayList<String>();
		 Arrays.sort(strings);
		 for(int i=0; i < strings.length; i++) {
			 ans.add(Character.toString(strings[i].charAt(n)));
			 
		 }
		 Collections.sort(ans);
		 
		 for(int i =0; i < ans.size(); i++) {
			 for(int j = 0; j < strings.length; j++) {
				 // 추출한 문자와 완전한 문자에서 추출한 숫자가 같은 경우
				 if(strings[j] != "") {
					 if(ans.get(i).equals(Character.toString(strings[j].charAt(n)))) {
						 answer.add(strings[j]);
						 strings[j] = "";
						 break;
					 }
				 }
			 }
		 }
		 answer.forEach(item -> {
			 System.out.println("answer은 "+ item);
		 });
		
		 return answer.toArray(new String[answer.size()]);
  }
}