문제 설명
상현이는 낱말 게임을 하고 있습니다. 패턴이 주어졌을 때, 이 패턴대로 낱말을 골라 순서에 맞게 연속해서 말하는 게임입니다.
패턴 p는 문자열로, 각 문자가 패턴의 심볼을 표현합니다. 예를 들어 주어진 패턴 p가 "가나나가"라면, 가 나 나 가에 맞는 낱말을 순서대로 말하면 됩니다.
각 패턴에는 아무 낱말을 사용할 수 있습니다. 단, 다른 패턴에 사용한 낱말을 다시 사용할 수는 없습니다.
예를 들어, 가 패턴에는 드래곤이라는 낱말을 선택하고, 나 패턴에는 바나나라는 낱말을 선택했다면 상현이는 "드래곤 바나나 바나나 드래곤"이라고 말했을 때 게임에서 승리합니다.
동일한 패턴일 때, 다른 낱말을 선택할 수도 있습니다. 예를 들어 "상현이 천재 천재 상현이"라고 말해도, "떙칠이 바보 바보 땡칠이"라고 말해도 게임에서 승리합니다.
단, 같은 패턴인데 다른 낱말을 선택하여 "드래곤 바나나 바나나 드래곤"이라고 하거나, 다른 패턴인데 같은 낱말을 선택하여 "집에가고싶다 집에가고싶다 집에가고싶다 집에가고싶다"라고 할 경우에는 게임에서 패배합니다.
패턴 p와 상현이의 답안 s가 주어졌을 때, 게임에서 승리했는지 여부를 출력하는 프로그램을 구현하세요.
입력 형식
· p : 패턴 문자가 담긴 문자열
· s : 상현이의 답안이 공백으로 구분되어 담긴 문자
출력 형식
· 정답 여부를 논리 형식으로 반환
제약 사항
· p.length = 4
· 0 < s.length <= 1000
입출력 예시
· 예시1
· 입력
· p = "가나다라"
· s = "바나나 드래곤 스리랑카 오염"
· 출력 : true
· 설명 : 각 패턴마다 겹치지 않게 낱말을 선택하였으므로 정답이다.
· 예시2
· 입력
· p = "갸가갸가"
· s = "금도끼 은도끼 철도끼 은도끼"
· 출력 : false
· 설명 : 갸 패턴에 금도끼와 철도끼 두 가지 낱말을 섞어 사용했기 때문에 오답이다.
정답 코드
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
class Solution {
public boolean solution(String p, String s) {
String[] words = s.split(" "); // 문자열 공백 기준 분할하여 배열에 저장
Map<Character, String> map = new HashMap<>();
// 문자와 문자열을 연결하기 위한 map이라는 새로운 HashMap 객체 생성
// words 배열의 길이와 p 문자열 길이가 다르면 false 반환
if (words.length != p.length()) {
return false;
}
// words 배열과 p 문자열에서 중복되지 않은 문자와 문자열의 수를 구한 뒤,
// 두 수가 다르다면 false를 반환
// words를 stream으로 변환한 뒤 collect 함수를 이용해 중복을 제거한 값의 개수를 저장
int setWordsNum = Arrays.stream(words).collect(Collectors.toSet()).size();
// p 문자열에서 중복을 제거하기 위해 chars() 메서드를 이용해 문자열을 IntStream으로 변환
// boxed()를 호출해 Integer Stream으로 변환. toSet() 함수를 이용해 중복을 제거하고
// size() 함수로 중복을 제거한 값의 개수를 저장
int setPNum = p.chars().boxed().collect(Collectors.toSet()).size();
if (setWordsNum != setPNum) {
return false;
}
// p 문자열의 각 문자에 대해 반복문을 실행
for (int i = 0; i < p.length(); i++) {
char c = p.charAt(i);
// 만약 map이 해당 문자를 이미 가지고 있다면
// 그 문자열과 wrods[i]가 같지 않다면 false를 반환
if (map.containsKey(c) &&
!map.get(c).equals(words[i])) {
return false;
}
그렇지 않으면 map에 문자와 해당 문자열을 연결하여 저장
map.put(c, words[i]);
}
return true;
}
public static void main(String[] args) {
Solution st = new Solution();
String p = "가나다라";
String s = "바나나 드래곤 스리랑카 오염";
System.out.println(st.solution(p, s));
String p2 = "갸가갸가";
String s2 = "금도끼 은도끼 철도끼 은도끼";
System.out.println(st.solution(p2, s2));
}
}
'연습 코딩테스트' 카테고리의 다른 글
연습문제 2-1(5) 두 배열에 모두 존재하는 숫자 (0) | 2023.04.05 |
---|---|
연습문제 2-1(4) 중복을 제외한 단어의 수 (0) | 2023.04.05 |
연습문제 2-1(2) 평균 소득액 계산 (0) | 2023.04.05 |
연습문제 2-1(1) 가장 둘레가 긴 삼각형의 둘레 (0) | 2023.04.05 |
연습문제 1-5(5) 문자열 대/소문자 뒤집기 (0) | 2023.04.04 |