728x90

4개의 지표가 있고

지표에 관한 설문이 주어질 때 답안에 따라 점수를 부여하여 높은 점수를 가진 성격 유형을 가진다

이때 동점일 경우 사전순으로 빠른 유형을 선택한다. 

 

public String solution(String[] survey, int[] choices) {

String answer = "";

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

 

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

String before =survey[i].charAt(0)+"";

String after =survey[i].charAt(1)+"";

if(choices[i]==1) {

map.put(before, map.getOrDefault(before, 0)+3);

}else if(choices[i]==2) {

map.put(before, map.getOrDefault(before, 0)+2);

}else if(choices[i]==3) {

map.put(before, map.getOrDefault(before, 0)+1);

}else if(choices[i]==4) {

 

}else if(choices[i]==5) {

map.put(after, map.getOrDefault(after, 0)+1);

}else if(choices[i]==6) {

map.put(after, map.getOrDefault(after, 0)+2);

}else if(choices[i]==7) {

map.put(after, map.getOrDefault(after, 0)+3);

}

}

if(map.getOrDefault("T",0)>map.getOrDefault("R",0)) {

answer+="T";

}else {

answer+="R";

}

if(map.getOrDefault("F",0)>map.getOrDefault("C",0)) {

answer+="F";

}else {

answer+="C";

}

if(map.getOrDefault("M",0)>map.getOrDefault("J",0)) {

answer+="M";

}else {

answer+="J";

}

if(map.getOrDefault("N",0)>map.getOrDefault("A",0)) {

answer+="N";

}else {

answer+="A";

}

 

return answer;

}

map에 각 유형과 점수를 저장한다. 

점수가 같으면 사전순으로 빠른 유형이 answer에 더해진다.

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

삼총사 문제풀이  (0) 2023.09.25
문자열 내 마음대로 정렬하기 문제풀이  (0) 2023.09.25
약수의 개수와 덧셈 문제풀이  (0) 2023.09.24
달리기 경주 문제풀이  (0) 2023.09.24
공원 산책 문제풀이  (0) 2023.09.24
728x90

주어진 두수 사이의 수 중 약수의 개수가 짝수이면 더하고 홀수이면 빼서 결과값 반환 

 

public int solution(int left, int right) {

int answer = 0;

for (int i = left; i <= right; i++) {

if(primeNum(i)%2==0) {

answer+=i;

}else {

answer-=i;

}

}

return answer;

}

 

public int primeNum(int num) {

int count=0;

for (int i = 1; i*i <= num; i++) {

if(i*i==num)count++;

else if(num%i==0)count+=2;

}

return count;

}

단순하게 약수의 개수를 구해서 계산했다. 

 

그런데 약수를 구하는 primeNum을 보면 

i*i==num 

즉 제곱수인 경우는 1만 더하고 아니면 전부 2를 더해서 짝수이다. 

 

즉 제곱수만 빼고 나머지는 다 더하면 된다. 

 

public int solution2(int left, int right) {

int answer = 0;

for (int i = left; i <= right; i++) {

if(i%Math.sqrt(i)==0) {

answer-=i;

}else {

answer+=i;

}

}

return answer;

}

728x90

현재 순위대로 선수 배열이 주어지고 

callings 배열이 주어진다. 

해설진은 앞 선수를 한명 추월할 때마다 한번씩 calling하고 calling 순서대로 담은 배열이 callings 이다.

경기가 끝났을때 선수를 순위대로 담은 배열을 반환 

 

처음엔 순서가 있어서 ArrayList의 indexOf로 쉽게 찾을 수 있을 줄 알았는데 

indexOf도 결국 선형검색을 수행하기 때문에 이중포문과 별 차이가 없어서 시간초과된다. 

 

이름이 불리기 때문에 Map으로 하려고 했는데 

처음엔 map으로 이름 찾는건 좋은데 순서를 바꾸고 순서가 바뀐 map을 다시 배열로 변경하는 작업도 까다로워

결국 시간초과되었다. 

 

해결방법은 생각보다 간단했다.

public String[] solution(String[] players, String[] callings) {

int n = players.length;

HashMap<String, Integer> rank = new HashMap<>();

 

for (int i = 0; i < n; i++) {

rank.put(players[i], i);

}

 

for (String calling : callings) {

int i = rank.get(calling);

String temp = players[i - 1];

players[i - 1] = players[i];

players[i] = temp;

 

rank.put(players[i - 1], i - 1);

rank.put(players[i], i);

}

 

return players;

}

랭크맵으로 다시 선수 순위 배열을 만드는게 아니라 랭크맵은 순위를 참조하기만 하고 players를 조작해 반환한다. 

 

 

 

 맵을 선수 이름으로 순위를 찾는 맵과 순위로 선수 이름을 찾는 맵을 만드는 방법도 있다. 

같은 내용을 키와 값만 바꿔서 두개의 맵을 만들어 사용하는건 다른데서도 쓸 수 있지 않을까싶어 만들어보았다. 

public String[] solution2(String[] players, String[] callings) {

String[] answer = new String[players.length];

Map<String,Integer> a = new HashMap<String, Integer>();

Map<Integer,String> b = new HashMap<Integer,String>();

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

a.put(players[i],i);

b.put(i, players[i]);

}

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

int callingsRank = a.get(callings[i]);

a.replace(callings[i],callingsRank-1);

String prev = b.get(callingsRank-1);

b.replace(callingsRank-1, callings[i]);

a.replace(prev, callingsRank);

b.replace(callingsRank, prev);

}

for (int i = 0; i < a.size(); i++) {

answer[i]=b.get(i);

}

return answer;

}

 

 

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

성격 유형 검사하기 문제풀이  (0) 2023.09.25
약수의 개수와 덧셈 문제풀이  (0) 2023.09.24
공원 산책 문제풀이  (0) 2023.09.24
신고 결과 받기 문제풀이  (0) 2023.09.23
소수찾기 문제풀이  (0) 2023.09.18
728x90

문자열 배열로 시작지점S, 장애물X이 표시된 공원 ex){"SOO","OOX","OOO"},

문자열 배열로 "E 1"과 같이 이동방향+공백+이동거리가 주어진 이동 명령 ex){"E 1","S 1"}이 주어질 때 

길이 없거나 가는 길에 장애물이 있는 경우 명령을 무시하고 다음 명령을 수행한다면 

최종 도착지를 int[]로 반환

public int[] solution(String[] park, String[] routes) {

int[] position= new int[2];//S 찾아서 바꿔줘

for (int i = 0; i < park.length; i++) {//시작위치 설정

if(park[i].contains("S")) {

position[0] = i;

position[1] = park[i].indexOf("S");

break;

}

}

int[][] parkArr = new int[park.length][park[0].length()];

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

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

if(park[i].charAt(j)=='X')parkArr[i][j]=1;

}//park 정수행렬로 변경

}

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

if(isPossible(parkArr,position,routes[i]))position=move(position,routes[i]);

}

return position;

}

public boolean isPossible(int[][] parkArr, int[] position, String route) {

String direction = route.split(" ")[0];

int distance = Integer.valueOf(route.split(" ")[1]);

//장애물이 있는지, 길이 있는지

if(direction.equals("E")) {

if(position[1]+distance>parkArr[0].length-1)return false;

for (int i = 1; i <= distance; i++) {

if(parkArr[position[0]][position[1]+i]==1)return false;

}

}else if(direction.equals("W")) {

if(position[1]-distance<0)return false;

for (int i = 1; i <= distance; i++) {

if(parkArr[position[0]][position[1]-i]==1)return false;

}

}else if(direction.equals("N")) {

if(position[0]-distance<0)return false;

for (int i = 1; i <= distance; i++) {

if(parkArr[position[0]-i][position[1]]==1)return false;

}

}else if(direction.equals("S")) {

if(position[0]+distance>parkArr.length-1)return false;

for (int i = 1; i <= distance; i++) {

if(parkArr[position[0]+i][position[1]]==1)return false;

}

}

 

 

return true;

}

public int[] move(int[] position,String route) {

String direction = route.split(" ")[0];

String distance = route.split(" ")[1];

if(direction.equals("E")) {

position[1]+=Integer.valueOf(distance);

}else if(direction.equals("W")) {

position[1]-=Integer.valueOf(distance);

}else if(direction.equals("N")) {

position[0]-=Integer.valueOf(distance);

}else if(direction.equals("S")) {

position[0]+=Integer.valueOf(distance);

}

return position;

}

isPossible 로 이동 가능한지 확인 후 move로 이동을 수행한다. 

String 배열로 주어진 park는 핸들링하기 편하게 int[][] 로 행렬로 바꾸어 준다. 

 

isPossible은 길이 있는지, 있다면 가는 길에 장애물이 있는지 확인하여야 한다. 

 

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

약수의 개수와 덧셈 문제풀이  (0) 2023.09.24
달리기 경주 문제풀이  (0) 2023.09.24
신고 결과 받기 문제풀이  (0) 2023.09.23
소수찾기 문제풀이  (0) 2023.09.18
소인수분해 문제풀이  (0) 2023.09.18

+ Recent posts