Myo-Kyeong Tech Blog

[프로그래머스] Lv.1 가장 가까운 같은 글자 (Python / Java) 본문

프로그래머스

[프로그래머스] Lv.1 가장 가까운 같은 글자 (Python / Java)

myo-kyeong 2023. 6. 17. 18:17
728x90
반응형

 

https://school.programmers.co.kr/learn/courses/30/lessons/142086?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명


문자열 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 ≤ s의 길이 ≤ 10,000
s은 영어 소문자로만 이루어져 있습니다.

 

입출력 예

 


 

문제 풀이

  1. 각 문자의 마지막 등장 위치를 저장빈 해시맵(또는 딕셔너리)를 생성
  2. 결과를 저장빈 배열 또는 리스트 생성. (배열 또는 리스트 크기는 입력 문자열의 길이와 동일하게 생성)
  3. 문자열의 각 문자를 처음부터 끝까지 반복
    • 각 반복에서 현재 문자가 해시맵(또는 딕셔너리)에 존재한다면(즉, 해당 문자가 이전에 등장했다면), 현재 위치에서 이 문자의 마지막 위치를 뺀 값을 결과 배열(또는 리스트)에 저장.
    • 만약 현재 문자가 해시맵이 존재하지 않다면(즉, 해당 문자가 처음 등장한다면), -1을 결과 배열(또는 리스트)에 저장
    • 시맵에 현재 문자와 그 위치를 저장하여, 해당 문자의 마지막 위치 갱신
  4. 모든 문자의 반복이 끝나면 결과 배열(또는 리스트) 반환

 

[Python3]

def solution(s):
    
    last_occurrence = {}
    answer = []
    
    for i, c in enumerate(s):
        if c in last_occurrence:
            answer.append(i - last_occurrence[c])
        else:
            answer.append(-1)
        last_occurrence[c] = i
        
    return answer

 

[Java]

import java.util.HashMap;

class Solution {
    public int[] solution(String s) {
        HashMap<Character, Integer> lastOccurrence = new HashMap<>();
        int[] answer = new int[s.length()];

        for (int i = 0; i < s.length(); i++ ) {
            char c = s.charAt(i);
            if(lastOccurrence.containsKey(c)) {
                answer[i] = i - lastOccurrence.get(c);
            } else {
                answer[i] = -1;
            }
            lastOccurrence.put(c,i);
        }
        return answer;
    }
}

 

[Java -  다른 사람 풀이]

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);
            answer[i] = i-map.getOrDefault(ch,i+1);
            map.put(ch,i);
        }
        return answer;
    }
}

해당 문자가 이전에 등장했는 여부에 대해 if문으로 나눴었는데  getOrDefault를 사용하여 한 번에 처리하여 코드가 간결해졌다!!

728x90
반응형