Open SDeung01 opened 1 year ago
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
- 입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
- 1 ≦ n ≦ 16
- arr1, arr2는 길이 n인 정수 배열로 주어진다.
- 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
- 원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for(int i = 0; i < n; i++){
String map1 = Integer.toBinaryString(arr1[i]);
String map2 = Integer.toBinaryString(arr2[i]);
long longMap1 = Long.parseLong(map1);
long longMap2 = Long.parseLong(map2);
String map = String.format("%0"+n+"d", longMap1 + longMap2);
map = map.replace("0"," ");
map = map.replace("1","#");
map = map.replace("2","#");
answer[i] = map;
}
return answer;
}
}
String map = String.format("%0"+n+"d", longMap1 + longMap2);
for (int i = 0; i < n; i++) {
result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
}
(arr1[i] | arr2[i])
는 각 정수를 2진수(bit)로 변환해 두 비트를 비교하여 둘 중 하나라도 1이면 1로 표현하는 OR연산자다.0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
입력 형식
- "점수|보너스|[옵션]"으로 이루어진 문자열 3세트. 예) 1S2D*3T
- 점수는 0에서 10 사이의 정수이다.
- 보너스는 S, D, T 중 하나이다.
- 옵선은 *이나 # 중 하나이며, 없을 수도 있다.
출력 형식
- 3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다. 예) 37
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public int solution(String dartResult) {
// 정규표현식을 사용한 패턴을 컴파일
// 정규식의 의미는 (0~9까지의 숫자가 반드시 하나 이상)('S','D','T' 중 하나)('','#' 중 하나가 없거나 혹은 하나)
Pattern pattern = Pattern.compile("(?
// bonus그룹에 캡처된 문자열의 값에 따라 1~3까지의 정수 저장
int bonus = matcher.group("bonus").equals("S") ? 1 :
matcher.group("bonus").equals("D") ? 2 :
3 ;
// option그룹에 캡처된 문자열의 값에 따라 -1,1,2 중 적절한 값 정수 저장
int option = matcher.group("option").equals("*") ? 2 :
matcher.group("option").equals("#") ? -1 :
1 ;
if(option == 2) {
scores[chance] = (int) Math.pow(score,bonus) * option;
scores[chance-1] = scores[chance-1] * option;
} else {
scores[chance] = (int) Math.pow(score,bonus) * option;
}
chance++;
}
return scores[1] + scores[2] + scores[3];
}
}
## 회고
- 정규표현식을 사용하면 문자열에 대한 복잡한 검증을 손쉽게 처리할 수 있다.
- 다만 식의 구조가 난해하여 사용에 많은 숙달이 필요해보인다.
- 관련 내용에 대해 공부하여 아래에 링크로 첨부한다.
[[Java] 정규표현식과 Pattern/Matcher] 에 대하여 학습한 내용을 정리하였습니다. 정규표현식에 대해 대략적인 해석은 가능해졌으나 실질적인 사용은 아직 많은 시행착오가 필요할 것 같습니다.
문제 1 : 가장 가까운 같은 글자
문제
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다. 예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
입출력 예
s | result -- | -- "banana" | [-1, -1, -1, 2, 2, 2] "foobar" | [-1, -1, 1, -1, -1, -1]문제 풀이
회고
indexOf()
를 사용할 계획을 우선 세우기는 했으나lastIndexOf()
의 기능을 조금 잘못 알고 있어서 다시 찾아보았다.lastIndexOf()
를 사용할 시 문자열에서 찾는 문자 중 가장 마지막에 오는 문자의 위치를 반환하는 줄 알고 있었으나 정확히는 문자열의 뒤에서부터 역순으로 문자를 탐색하고 가장 먼저 나오는 문자의 인덱스(= 문자열을 기준으로 봤을 때는 가장 뒤)를 반환한다. 중요한 점은 여기서 반환하는 인덱스는 문자열의 가장 앞을 0으로 하여 1씩 증가하는 기존의 인덱스와 동일하다.indexOf(int ch, int fromIndex)
와 동일하게 탐색 시작지점을 지정할 수 있다.(lastIndexOf(int ch, int fromIndex)
/ 시작지점부터 역순으로 탐색)