728x90

S, D(점수 2제곱),T(점수 3제곱)

*(앞점수와 해당 점수 2배), #(해당 점수를 음수로)

3번의 다트 점수가 주어질때 S,D,T, * , # 를 계산한 총점을 반환 

public int solution(String dartResult) {

int answer = 0;

char[] arr = dartResult.toCharArray();

ArrayList<Integer> scoreList = new ArrayList<>();

for (int i=-0; i<arr.length;i++) {

if(Character.isDigit(arr[i])&&!Character.isDigit(arr[i+1])) {

scoreList.add(Integer.parseInt(arr[i]+""));

}else if(Character.isDigit(arr[i])) {

scoreList.add(Integer.parseInt(arr[i]+""+arr[i+1]));

i++;

}else if(arr[i]=='D') {

int score =scoreList.get(scoreList.size()-1);

score = score*score;

scoreList.remove(scoreList.size()-1);

scoreList.add(score);

}else if(arr[i]=='T') {

int score = scoreList.get(scoreList.size()-1);

score = score*score*score;

scoreList.remove(scoreList.size()-1);

scoreList.add(score);

}else if(arr[i]=='*') {

int score = scoreList.get(scoreList.size()-1);

score = 2*score;

scoreList.remove(scoreList.size()-1);

scoreList.add(score);

if(scoreList.size()>=2) {

int pscore = scoreList.get(scoreList.size()-2);

pscore = 2*pscore;

scoreList.remove(scoreList.size()-2);

scoreList.add(scoreList.size()-1, pscore);

}

}else if(arr[i]=='#') {

int score = scoreList.get(scoreList.size()-1);

score = -1*score;

scoreList.remove(scoreList.size()-1);

scoreList.add(score);

}

}

for (Integer integer : scoreList) {

answer+=integer;

}

return answer;

}

점수리스트를 만들어 

int score = scoreList.get(scoreList.size()-1);

를 통해 해당 점수를 얻어 S,D,T, *, # 연산을 해준다. 

만약 *의 경우 앞에 점수가 있다면 

 

if(scoreList.size()>=2) {

int pscore = scoreList.get(scoreList.size()-2);

pscore = 2*pscore;

scoreList.remove(scoreList.size()-2);

scoreList.add(scoreList.size()-1, pscore);

}

이전 점수까지 계산해주고 본래 위치로 다시 삽입한다. 

 

for (Integer integer : scoreList) {

answer+=integer;

}

이후 answer에 리스트를 순회하면서 점수를 각각 더해준다.

728x90

실패율 = 도달했으나 클리어하지 못한 유저 수/ 도달한 유저 수

아무도 도달하지 못한 경우 실패율 = 0

전체 스테이지 개수 N 

현재 유저들이 멈춰있는 스테이지 번호가 담긴 배열 stages

실패율이 높은 스테이지부터 내림차순으로 정렬하고 실패율이 같은 경우 스테이지 번호의 오름차순 정렬하여 반환

 

int[] current = new int[N+1];

for (int i = 0; i < stages.length; i++) {

for (int j = 0; j < stages[i]; j++) {

current[j]++;

}

}

각 스테이지별 현재까지 유저들이 지나가거나 멈춰있는 횟수를 담은 배열 current 

 

double[] failure = new double[N];

for (int i = 0; i < failure.length; i++) {

if(current[i]==0)failure[i]=0.0;

else failure[i] = (0.0+current[i]-current[i+1])/current[i];

}

실패율을 double[]로 저장 

만약 도달한 사람이 없다면 (current[i]==0) 실패율은 0.0 

 

Map<Double,ArrayList<Integer>> failureMapR = new HashMap<Double, ArrayList<Integer>>();

for (int i = 0; i < failure.length; i++) {

ArrayList<Integer> list = failureMapR.getOrDefault(failure[i], new ArrayList<Integer>());

list.add(i+1);

failureMapR.put(failure[i], list);

}

 

실패율을 map에 저장 

실패율을 key로 

해당 실패율에 대한 층 수는 중복될 수 있으므로 ArrayList<Integer>를 value로 갖는다. 

 

Arrays.sort(failure);

for (int i = failure.length-1; i >=0; i--) {

ArrayList<Integer> temp = failureMapR.get(failure[i]);

for (int j = 0; j < temp.size(); j++) {

answer.add(temp.get(j));

}

temp.removeAll(temp);

}

failure를 정렬하고 정렬된 배열의 뒷원소부터 map에서 찾아서 층 수를 answer에 저장해준다.

'Java > Coding Test' 카테고리의 다른 글

로또의 최고 순위와 최저 순위 문제 풀이  (0) 2023.10.04
다트 게임 문제 풀이  (0) 2023.10.04
문자열 나누기 문제 풀이  (1) 2023.10.01
대충 만든 자판 문제 풀이  (0) 2023.10.01
모의고사 문제 풀이  (0) 2023.09.30
728x90

첫 문자를 읽고 그 다음 문자를 읽어가면서 

첫 문자와 같은 문자와 같지 않은 문자의 수가 같아질때마나다 문자열을 분할하며 읽고 분할된 문자열의 개수를 반환 

 

public int solution(String s) {

int answer = 0;

char firstLetter = '0';

int count=0;

for(char c : s.toCharArray()) {

if(count==0) {

firstLetter = c;

answer++;

}

 

if(firstLetter==c) {

count++;

}else {

count--;

}

 

}

return answer;

}

문제를 이해하는데 시간이 좀 걸렸다; 

첫 문자열을 저장하고 이후 반복부터 첫 문자열과 같으면 count를 증가 첫문자열과 다르면 count를 감소하여 

count가 0이 되는 인덱스가 첫 문자와 같은 문자의 수와 같지 않은 문자의 수가 같게 되는 인덱스 이므로 

그 인덱스에서 문자열을 분할한다는 의미로 answer를 증가시킨다. 

문자열을 n번 분할하면 분할된 문자열은 n+1 개가 된다. 

여기서는 처음 firstLetter를 지정하면서 count가 answer를 증가시키기 때문에 나중에 증가시킬 필요 없다. 

'Java > Coding Test' 카테고리의 다른 글

다트 게임 문제 풀이  (0) 2023.10.04
실패율 문제 풀이  (0) 2023.10.01
대충 만든 자판 문제 풀이  (0) 2023.10.01
모의고사 문제 풀이  (0) 2023.09.30
개인정보 수집 유효 기간 문제 풀이  (0) 2023.09.28
728x90

하나의 키에 할당된 문자들이 순서대로 담긴 문자열 배열 keymap과 

입력하려는 문자열이 담긴 배열 targets가 주어질때 

하나의 target을 입력하기 위해 키를 총 몇번을 눌러야하는지를 배열로 반환 

public int[] solution(String[] keymap, String[] targets) {

int[] answer = new int[targets.length];

Map<Character,Integer> map = new HashMap<Character, Integer>();

for (int i = 0; i < keymap.length; i++) {

for (int j = 0; j < keymap[i].length(); j++) {

if(map.getOrDefault(keymap[i].charAt(j), 0)==0||map.getOrDefault(keymap[i].charAt(j), 0)>j+1)

map.put(keymap[i].charAt(j), j+1);

}

}

for (int i = 0; i < targets.length; i++) {

int repeat = 0;

for (int j = 0; j < targets[i].length(); j++) {

int temp = map.getOrDefault(targets[i].charAt(j),-1);

if(temp!=-1)

repeat+=temp;

else {

repeat=-1;

break;

}

}

answer[i] = repeat;

 

}

return answer;

}

 map에 입력하려는 문자에 대한 키의 최소 입력횟수를 저장

만약 다른 키에서 동일한 문자의 최소 입력횟수가 더 적을 경우 적은 횟수를 저장 

 

'Java > Coding Test' 카테고리의 다른 글

실패율 문제 풀이  (0) 2023.10.01
문자열 나누기 문제 풀이  (1) 2023.10.01
모의고사 문제 풀이  (0) 2023.09.30
개인정보 수집 유효 기간 문제 풀이  (0) 2023.09.28
숫자 짝궁 문제 풀이  (1) 2023.09.28

+ Recent posts