1. 문제 설명
문자열이 주어졌을 때, 해당 문자열의 왼쪽에서부터 N/2개의 문자, 오른쪽에서부터 N/2개의 문자를 각각 군집화 한다.
(만약 N/2가 소수점을 가지면 내림한다.)
각 군집에서 문자를 서로 교환하였을 때, 펠린드롬 문자가 만들어지면 Yes
, 어떻게 해도 안되면, No
를 출력하라.
펠린드롬이란?
앞에서부터 읽어도, 뒤에서부터 읽어도 같은 문자열을 의미한다.
ex) 기러기
, radar
2. 접근 방식
그냥 문제에서 주어진 그대로 풀면 된다.
- 문자열을 왼쪽에서부터 N/2 개의 문자, 오른쪽에서 부터 N/2 개의 문자로 나눈다.
- 각 문자들의 개수를 센다.
- 알파벳 별로 하나라도 문자가 짝수가 아니면, 아무리 바꿔도 펠린드롬이 되지 않는다. 이때는
No
를 출력한다. - 모든 알파벳의 개수가 짝수이다.
Yes
를 출력한다.
3. 코드 분석
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
HashMap<Character, Integer> map = new HashMap<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String s = br.readLine();
for (int i = 0; i < (N/2); i++) {
map.compute(s.charAt(i), (k, ov) -> map.get(k) == null? 1 : map.get(k)+1);
map.compute(s.charAt(N-i-1), (k, ov) -> map.get(k) == null? 1 : map.get(k)+1);
}
for (char temp : map.keySet()){
if (map.get(temp) % 2 != 0) {
System.out.println("No");
return;
}
}
System.out.println("Yes");
}
}
4. 성장 하기
나는 문제를 풀 때, map이란 자료구조를 활용하여 값을 집어넣었다.
다른 사람의 풀이를 보니 그냥 알파벳 전체를 대변하는 26개짜리 배열을 만들고, 거기에 value로 해당 알파벳이 나온 개수를 세는 경우 나보다 2배정도 빨랐다.
int [] alphabets = new int[26]; // 선언
alphabets[str.charAt(i) - 'a']++; // 각 알파벳이 나온 횟수 세기
'알고리즘 > 문제 풀이' 카테고리의 다른 글
99클럽 코테 스터디 29일 TIL + [LeetCode] maximum-profit-job-scheduling 풀이설명 (0) | 2024.08.20 |
---|---|
99클럽 코테 스터디 28일차 + [백준] 1874 스택 수열 java 풀이 (0) | 2024.08.18 |
99클럽 코테 스터디 26일차 TIL + [프로그래머스] 개인정보 수집 유효기간 풀이 (0) | 2024.08.16 |
99클럽 코테 스터디 25일차 TIL + [프로그래머스] 순위 두 가지 풀이 ✨ (0) | 2024.08.15 |
[백준] 2644 촌수계산 java 풀이 (0) | 2024.08.08 |