일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- 리눅스
- 정처기
- 코테
- programmers
- 파이썬
- Java
- 우분투
- db
- mysql
- LV 0
- Linux
- Ai
- 머신러닝
- Kubernetes
- 쿠버네티스
- docker
- github
- 자료구조
- 알고리즘
- Lv 2
- 자바
- Python
- git
- DevOps
- 코딩테스트
- 인공지능
- ubuntu
- 데이터베이스
- 깃
- Today
- Total
Myo-Kyeong Tech Blog
[프로그래머스] Lv.1 가장 가까운 같은 글자 (Python / Java) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/142086?language=python3
문제 설명
문자열 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을 결과 배열(또는 리스트)에 저장
- 해시맵에 현재 문자와 그 위치를 저장하여, 해당 문자의 마지막 위치 갱신
- 모든 문자의 반복이 끝나면 결과 배열(또는 리스트) 반환
[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를 사용하여 한 번에 처리하여 코드가 간결해졌다!!
'프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.0 문자열 곱하기 (Python / Java) (0) | 2023.06.18 |
---|---|
[프로그래머스] Lv.2 전화번호 목록 (Python / Java) (2) | 2023.06.18 |
[프로그래머스] Lv.0 이진수 더하기 (Python / Java) (0) | 2023.06.16 |
[프로그래머스] Lv.0 공백으로 구분하기 1 (Python / Java) (0) | 2023.06.15 |
[프로그래머스] Lv.1 2018 KAKAO BLIND RECRUITMENT [1차] 비밀지도 (Python) (0) | 2023.06.14 |