devnoong.log
728x90

1. 프로그래머스 Level 1 가장 가까운 같은 글자 JAVA 풀이

 

문자열 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]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.




위의 문제를 보고 든 생각은 문제 안에 있는 -1 을 보고 바로 indexOf 함수가 떠올라 이를 활용해서 구현해야겠다는 생각이 들었다.

 

 지문 중에서는 가장 가까운 곳의 위치를 물어봤기때문에 lastIndexOf 함수를 사용했고, 현재 위치와의 거리를 물어봤으므로  현재 위치에서 해당 위치를 빼면 되었다.

 

<java />
int[] result = new int [s.length()]; String compare = ""; for(int i=0 ; i< s.length(); i++){ int index = compare.lastIndexOf(s.substring(i,i+1)); if(index== -1){ result[i] = -1; }else{ result[i] = i- index; } compare +=s.substring(i,i+1); }

 


1.1. 다른사람 풀이

HashMap의 getOrDefault를 이용해 해결 한 풀이가 가장 인상깊었다.

 

getOrDefault를 이용함으로써 if문을 사용하지도 않고도 데이터 일치 여부를 판단해 한 라인으로 코드를 구성 할 수 있었다.

-1의 값은 i보다 1보다 큰값으로 default를 정해놔 데이터가 존재하지 않으면 -1을 return하도록 구성되어 있다.

 

<java />
int[] answer = new int[s.length()]; HashMap<Character,Integer> map = new HashMap<>(); for(int i=0; i<s.length();i++){ char ch = s.charAt(i); answer[i] = i-map.getOrDefault(ch,i+1); map.put(ch,i); } return answer;

 

 

 

getOrDefault를 이용하지 않아도 HashMap의 중복되는 key값은 overwrite가 된다는 점을 활용해서도 많이들 푼 것 같다.

 

<java />
int[] answer = new int[s.length()]; HashMap<Character, Integer> map = new HashMap<>(); for(int i=0; i<s.length(); i++) { if(!map.containsKey(s.charAt(i))) { answer[i] = -1; map.put(s.charAt(i), i); }else { int before = map.get(s.charAt(i)); answer[i] = i - before; map.put(s.charAt(i), i); } }

 

728x90