티스토리 뷰

1️⃣ 저주의 숫자 3

 

문제 설명

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 원소 ≤ 10,000
  • 1 ≤ numlist의 길이 ≤ 100
  • numlist는 중복된 원소를 갖지 않습니다.

입출력 예

numlist n result
[1, 2, 3, 4, 5, 6] 4 [4, 5, 3, 6, 2, 1]
[10000,20,36,47,40,6,10,7000] 30 [36, 40, 20, 47, 10, 6, 7000, 10000]

 

입출력 예 #1

  • 4에서 가까운 순으로 [4, 5, 3, 6, 2, 1]을 return합니다.
  • 3과 5는 거리가 같으므로 더 큰 5가 앞에 와야 합니다.
  • 2와 6은 거리가 같으므로 더 큰 6이 앞에 와야 합니다.

입출력 예 #2

  • 30에서 가까운 순으로 [36, 40, 20, 47, 10, 6, 7000, 10000]을 return합니다.
  • 20과 40은 거리가 같으므로 더 큰 40이 앞에 와야 합니다.

 

💻 나의 풀이

import java.util.Arrays;

class Solution {
    public int[] solution(int[] numlist, int n) {
//        int[] answer = new int[numlist.length];
        Arrays.sort(numlist);
        
        for(int i=0; i<numlist.length; i++) {
            for(int j=0; j<numlist.length; j++) {
                if(Math.abs(n-numlist[i]) <= Math.abs(n-numlist[j])) {
                    
                    int temp = numlist[i];
                    numlist[i] = numlist[j];
                    numlist[j] = temp;
                }
            }
        }
        
        return numlist;
    }
}

 

문제를 보자마자 먼저 정수 n과 배열의 원소들을 뺀 나머지들을 비교해서 더 작은 값부터 정렬해야겠다는 생각이 떠올랐습니다.

굳이 answer가 필요없기 때문에 주석처리를 해주고

주어진 배열 numlist를 오름차순으로 정렬합니다.

그 다음 두번의 반복문을 통해 현재 원소 numlist[i]와 다른 원소 numlist[j] 간의 차이를 비교합니다. 만약 차이가 같거나 더 작다면 교환합니다.

최종적으로 두 원소의 위치를 교환해서 정렬된 배열인 numlist를 반환합니다.

 


 

2️⃣ 등수 매기기

 

문제 설명

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 0 ≤ score[0], score[1] ≤ 100
  • 1 ≤ score의 길이 ≤ 10
  • score의 원소 길이는 2입니다.
  • score는 중복된 원소를 갖지 않습니다.

입출력 예

score result
[[80, 70], [90, 50], [40, 70], [50, 80]] [1, 2, 4, 3]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] [4, 4, 6, 2, 2, 1, 7]

 

입출력 예 #1

  • 평균은 각각 75, 70, 55, 65 이므로 등수를 매겨 [1, 2, 4, 3]을 return합니다.

입출력 예 #2

  • 평균은 각각 75, 75, 40, 95, 95, 100, 20 이므로 [4, 4, 6, 2, 2, 1, 7] 을 return합니다.
  • 공동 2등이 두 명, 공동 4등이 2명 이므로 3등과 5등은 없습니다.

 

💻 나의 풀이

class Solution {
    public int[] solution(int[][] score) {
        int sc = score.length;
        int[] answer = new int[sc];
        int[] sum = new int[sc];
        
        for(int i=0; i<sc; i++){
            sum[i] = score[i][0]+score[i][1];
        }
        
        for(int i=0; i<sc; i++) {
            answer[i] = 1;
            for(int j=0; j<sc; j++) {
                if(sum[i] < sum[j]) {
                    answer[i]++;
                }
            }
        }
        return answer;
    }
}

 

처음에는 당연히 평균 점수이니까 두 점수를 합하고 2로 나누는 방법을 생각했습니다.

하지만 문제의 조건에서 원소 길이가 2로 고정되어있으므로 굳이 나누기 연산을 하지 않아도 됩니다.

만약 길이가 다양하다면 나누기 연산을 해야할 것 입니다.

 

score 배열의 길이 (행의 개수)를 sc 변수에 담고

각 행의 등수를 저장할 배열 answer를 생성하고

각 행의 점수 합산을 저장할 배열 sum을 생성합니다.

이후 반복문을 통하여 각 행의 점수 합산을 계산해줍니다.

또 한번 반복문을 통해서 등수를 계산 해주는데 특정 행의 점수 합이 다른 행의 점수 합보다 크면 등수를 +1 증가시킵니다. 따라서, 더 높은 점수 합을 가진 행일수록 등수가 낮아지게 됩니다.

최종적으로 등수가 계산된 answer 배열을 반환합니다.

 

for문이 너무 많은거 같아서 더 효율적인 코드로 개선시키고 싶네요. 😥

 

 

🔎 다른 사람의 풀이

import java.util.*;

class Solution {
    public int[] solution(int[][] score) {
    
        // 각 행의 점수 합을 저장할 리스트
        List<Integer> scoreList = new ArrayList<>();
        
        // 각 행의 점수 합을 리스트에 추가
        for (int[] t : score) {
            scoreList.add(t[0] + t[1]);
        }

        // 리스트를 내림차순으로 정렬
        scoreList.sort(Comparator.reverseOrder());

        // 각 행의 등수를 저장할 배열
        int[] answer = new int[score.length];

        // 등수 계산
        for (int i = 0; i < score.length; i++) {
            // 현재 행의 점수 합의 등수를 찾아서 배열에 저장
            answer[i] = scoreList.indexOf(score[i][0] + score[i][1]) + 1;
        }

        // 결과 등수 배열 반환
        return answer;
    }
}

 

scoreList라는 ArrayList를 생성하여 각 행의 점수 합을 저장합니다.

각 행의 점수 합을 리스트에 추가하는 반복문을 통해 데이터를 채웁니다.

그리고 .sort(Comparator.reverseOrder()) 를 사용하여 scoreList내림차순으로 정렬합니다.

각 행의 등수를 저장할 배열 answer를 초기화한 후, 등수를 계산하는 반복문에서 현재 행의 점수 합의 등수를 찾아서 answer 배열에 저장합니다.

최종적으로 등수가 계산된 answer 배열을 반환합니다.

 

배열을 사용하는 방식 대신에 ArrayList를 활용하여 간결하게 등수를 계산하는 방법을 사용했고,

Java에서 사용되는 정렬 메서드 중 하나로, 요소들을 역순으로 정렬하는 메서드인.sort(Comparator.reverseOrder())를 사용했습니다.

참고로 answer[i] = scoreList.indexOf(score[i][0] + score[i][1]) + 1;에서 +1은 등수를 1부터 시작하게 하기 위한 조치입니다.

 


 

 

3️⃣ 옹알이 (1)

 

문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
    • 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

입출력 예

babbling result
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3

 

입출력 예 #1

  • ["aya", "yee", "u", "maa", "wyeoo"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

입출력 예 #2

  • ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye", "ye" + "ma" + "woo" = "yemawoo"로 3개입니다. 따라서 3을 return합니다.

유의사항

  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.

💻 나의 풀이

class Solution {
    public int solution(String[] babbling) {
        String[] str = {"aya", "ye", "woo", "ma"};
        int answer = 0;
        
        for(int i=0; i<babbling.length; i++){
            for(int j=0; j<str.length; j++){   // 발음 가능한 단어들을 찾아서
                babbling[i] = babbling[i].replace(str[j], " ");   // 공백으로 대체
            }
            
            if(babbling[i].trim().length() == 0){  // 양쪽의 공백 제거
                answer++;
            }
        }
        return answer;
    }
}

 

예전에 풀었던 문제라 기록해둔게 남아있어서 말을 줄이겠습니다.

 

 


 

4️⃣ 로그인 성공?

 

문제 설명

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

  • 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
  • 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

 

제한사항

  • 회원들의 아이디는 문자열입니다.
  • 회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.
  • 회원들의 패스워드는 숫자로 구성된 문자열입니다.
  • 회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.
  • id_pw의 길이는 2입니다.
  • id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.
  • 1 ≤ 아이디의 길이 ≤ 15
  • 1 ≤ 비밀번호의 길이 ≤ 6
  • 1 ≤ db의 길이 ≤ 10
  • db의 원소의 길이는 2입니다.

입출력 예

id_pw db result
["meosseugi", "1234"] [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] "login"
["programmer01", "15789"] [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] "wrong pw"
["rabbit04", "98761"] [["jaja11", "98761"], ["krong0313", "29440"], ["rabbit00", "111333"]] "fail"

 

입출력 예 #1

  • db에 같은 정보의 계정이 있으므로 "login"을 return합니다.

입출력 예 #2

  • db에 아이디는 같지만 패스워드가 다른 계정이 있으므로 "wrong pw"를 return합니다.

입출력 예 #3

  • db에 아이디가 맞는 계정이 없으므로 "fail"을 return합니다.

💻 나의 풀이

class Solution {
    public String solution(String[] id_pw, String[][] db) {
        for(int i=0; i<db.length; i++) {
            if(db[i][0].equals(id_pw[0])) {  // 아이디가 같다면
                if(db[i][1].equals(id_pw[1])) {  // 비밀번호도 같다면
                    return "login";
                } else return "wrong pw";
            }
        }
        return "fail";
    }
}

 

문제만 보고 겁 먹었는데 막상 풀었더니 오늘 푼 네 문제 중 가장 쉬운 것 같습니다. 😅

반복문으로 먼저 db에 저장된 배열을 순회하게 하고

만약 아이디가 같다면 => 비밀번호도 같은지 ( return "login" )
                                   => 비밀번호가 같지 않다면 => 아이디만 같고 비밀번호는 틀린 것이기 때문에 ( return "wrong pw" )

전부 다 아니라면 기본 반환값을 "fail" 로 해줍니다. 

 

 


 

 

 

평일 고정 알바를 시작했고, 개인 프로젝트도 시작하다보니 나약한 소리 같지만 점점 하루에 네 문제 풀기도 벅차집니다...

레벨1부터는 하루에 푸는 문제 수가 적어지지 않을까 싶어요.

하지만! 언제나 느릴지언정 꾸준히 하는 게 목표 입니다. 화이팅🔥

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함