[프로그래머스]가장 가까운 글자

allnight5·2023년 1월 9일
0

프로그래머스

목록 보기
8/73

문자열 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을 완성해주세요.


파이썬 첫번째

def solution(s):
    #2차원배열.. 과 사전형태둘중 뭐가좋을까??
    answer = []
    docs ={s[0:0+1]:0} 
    answer.append(1)
    for i in range(1,len(s)):
        if s[i:i+1] not in docs:
            docs[s[i:i+1]]=i
            answer.append(i)
        else : 
            docs[s[i:i+1]] -= i
            answer.append(docs[s[i:i+1]])
            docs[s[i:i+1]] = i
            
    for i in range(len(answer)):
        if answer[i]>0:
            answer[i] = -1
        else :
            answer[i] =answer[i]*-1
    return answer

파이썬 고치기..

def solution(s): 
    answer = []
    docs = dict() 
    for i in range(len(s)):
        if s[i] not in docs:
            answer.append(-1)
        else :  
            answer.append(i- docs[s[i]]) 
        docs[s[i]]=i
    return answer

자바 첫번째 실패

import java.util.*;
class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        HashMap<String, Integer> map = new HashMap<>();
        for (int i=0; i < s.length(); i++){
            char ch = s.charAt(i);
            if(!map.containsKey(ch)){
                answer[i] = -1;
            } else{
                answer[i] = i- map.get(ch); 
            }
            map.put(ch, i);
            
        }
        return answer;
    }
}

Char ch = 문자형인데.. Map의 key값은 String으로 해서그런다

자바 두번째 성공

import java.util.*;
class Solution {
    public int[] solution(String s) {
        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);
            if(!map.containsKey(ch)){
                answer[i] = -1;
            } else{
                answer[i] = i- map.get(ch); 
            }
            map.put(ch, i);
            
        }
        return answer;
    }
}
profile
공부기록하기

0개의 댓글