53. 최소 직사각형

class Solution {
public int solution(int[][] sizes) {
int answer = 0;
int maxW = 0;
int maxH = 0;
for(int i=0; i<sizes.length; i++){
int width = Math.max(sizes[i][0], sizes[i][1]);
int height = Math.min(sizes[i][0], sizes[i][1]);
if(width > maxW){
maxW = width;
}
if(height > maxH){
maxH = height;
}
}
answer = maxW * maxH;
return answer;
}
}
<작성한 코드>
최종적으로 들어갈 가로, 세로의 변수를 maxW, maxH로 잡았다. 그 뒤 for문을 사용해서 sizes의 길이만큼 반복시켜 준 뒤 width에는 각 배열의 원소중 큰 값, height에는 각 배열의 원소중 작은 값을 넣어줬다. 그 뒤 if문을 사용해서 크기를 비교해 줬다. width이 maxW보다 크다면 maxW에 값을 대입해 주고 height와 maxH를 비교했을 때 height의 값이 더 크면 maxH에 height을 넣어준다. 이렇게 반복문을 사용하면 둘 중 큰 값은 width에, 작은 값은 height에 비교되면서 각 배열의 두 원소중 작은 값의 가장 큰 값이 maxH에 들어가게 된다. 그 후 answer에 가로, 세로의 길이를 곱해주고 answer을 반환했다.
54. 나머지가 1이 되는 수 찾기

class Solution {
public int solution(int n) {
int answer = 1;
while(true){
if(n%answer == 1){
break;
}
answer++;
}
return answer;
}
}
<작성한 코드>
간단한 문제다. while문을 실행하게 하고 n에서 answer을 나눠서 1이 되면 break를 해줬다. answer은 1씩 더해준다. 그 뒤 answer값을 반환해 줬다.
55. 신고 결과받기

import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, HashSet<String>> map = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
for(int i=0; i<id_list.length; i++){
String id = id_list[i];
map.put(id, new HashSet<>());
map2.put(id, i);
}
for(String str : report){
String[] array = str.split(" ");
String reporter = array[0];
String reportee = array[1];
map.get(reportee).add(reporter);
}
for(int i=0; i<id_list.length; i++){
Set<String> mail = map.get(id_list[i]);
if(mail.size() >= k){
for(String id : mail){
answer[map2.get(id)]++;
}
}
}
return answer;
}
}
<작성한 코드>
생각할게 많은 문제였다. 우선 map을 두 개 만들었다. map, map2가 있는데 map은 사용자 ID를 키로 가지고 해당 사용자가 신고한 유저들을 담도록 했고, map2는 사용자의 ID를 키로가 지고 해당 사용자의 인덱스를 값으로 가지도록 했다. 첫 번째 for문에서는 ID리스트의 길이만큼 반복하였고 문자열 변수 id에 문자열을 넣어준 뒤 map에는 id와 빈 HashSet을 넣어주고, map2에는 id와 인덱스번호를 넣어줬다. 그 뒤 forEach문에서는 report에 있는 문자열을 공백을 기준으로 나눴다. 나누면 두 개로 나눠지는데 첫 번째가 신고한 유저, 두 번째가 신고당한 유저 이렇게 저장될 것이다. 따라서 map에서 신고당한 유저의 값에 신고한 유저를 추가해 줬다. 이렇게 하면 map에서 key값으로 사용된 사용자가 자신을 신고한 사용자의 이름을 가지게 될 것이다. 그리고 마지막 for문에서는 ID리스트의 길이만큼 반복하게 하였고, map에서 각각의 값을 꺼내서 Set에 넣어줬다. 만약 크기가 k보다 크거나 같으면 forEach문을 사용해서 그에 맞는 인덱스값인 map2를 사용해 1씩 더해줬다. 그 뒤 answer을 반환하였다.
56. 성격 유형 검사하기

import java.util.*;
class Solution {
public String solution(String[] survey, int[] choices) {
String answer = "";
Map<String, Integer> map = new HashMap<>();
for(int i=0; i<survey.length; i++){
int num = choices[i];
String[] s = survey[i].split("");
if(num > 0 && num < 4){
map.put(s[0], map.getOrDefault(s[0], 0) + 4 - num);
} else if(num > 4){
map.put(s[1], map.getOrDefault(s[1], 0) + num - 4);
}
}
// RT
if(map.getOrDefault("R", 0) >= map.getOrDefault("T", 0)){
answer += "R";
} else{
answer += "T";
}
//CF
if(map.getOrDefault("C", 0) >= map.getOrDefault("F", 0)){
answer += "C";
} else{
answer += "F";
}
// JM
if(map.getOrDefault("J", 0) >= map.getOrDefault("M", 0)){
answer += "J";
} else{
answer += "M";
}
// AN
if(map.getOrDefault("A", 0) >= map.getOrDefault("N", 0)){
answer += "A";
} else{
answer += "N";
}
return answer;
}
}
<작성한 코드>
map 하나를 선언해 주고 시작했다. for문을 사용해서 survey의 크기만큼 반복해 주고 s를 공백 없이 잘라서 문자열 배열 s에 넣어줬다. 그렇게 되면 두 개로 나뉠 것이다. 그 뒤 num의 크기를 비교했다. 1~3이라면 s [0]의 점수에 더해줘야 한다. 따라서 4에서 점수만큼 빼준뒤 넣어줬다. 만약 4보다 크다면 s [1]의 점수에 더해줘야 하기 때문에 num에서 4를 빼서 넣어줬다. 이렇게 되면 모르겠음을 제외하고 점수가 들어간다. 그 뒤 RT, CF, JM, AN을 각각 비교해 줬다. map에서 값을 꺼내왔다. 만약 값이 없다면 0을 기본값으로 잡아줬다. 그 뒤 큰 값을 answer에 더해주고 answer을 반환하였다.
'프로그래머스 문제풀이 > 알고리즘 (JAVA)' 카테고리의 다른 글
남건욱's 공부기록