[문제]

대학 교수인 당신은, 상호평가를 통하여 학생들이 제출한 과제물에 학점을 부여하려고 합니다. 아래는 0번부터 4번까지 번호가 매겨진 5명의 학생들이 자신과 다른 학생의 과제를 평가한 점수표입니다.

No. 0 1 2 3 4
0 100 90 98 88 65
1 50 45 99 85 77
2 47 88 95 80 67
3 61 57 100 80 65
4 24 90 94 75 65
평균 45.5 81.25 97.2 81.6 67.8
학점 F B A B D

위의 점수표에서, i행 j열의 값은 i번 학생이 평가한 j번 학생의 과제 점수입니다.

  • 0번 학생이 평가한 점수는 0번 행에담긴 [100, 90, 98, 88, 65]입니다.
    • 0번 학생은 자기 자신에게 100점, 1번 학생에게 90점, 2번 학생에게 98점, 3번 학생에게 88점, 4번 학생에게 65점을 부여했습니다.
  • 2번 학생이 평가한 점수는 2번 행에담긴 [47, 88, 95, 80, 67]입니다.
    • 2번 학생은 0번 학생에게 47점, 1번 학생에게 88점, 자기 자신에게 95점, 3번 학생에게 80점, 4번 학생에게 67점을 부여했습니다.

당신은 각 학생들이 받은 점수의 평균을 구하여, 기준에 따라 학점을 부여하려고 합니다.
만약, 학생들이 자기 자신을 평가한 점수가 유일한 최고점 또는 유일한 최저점이라면 그 점수는 제외하고 평균을 구합니다.

  • 0번 학생이 받은 점수는 0번 열에 담긴 [100, 50, 47, 61, 24]입니다. 자기 자신을 평가한 100점은 자신이 받은 점수 중에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.
    • 0번 학생의 평균 점수는 (50+47+61+24) / 4 = 45.5입니다.
  • 4번 학생이 받은 점수는 4번 열에 담긴 [65, 77, 67, 65, 65]입니다. 자기 자신을 평가한 65점은 자신이 받은 점수 중에서 최저점이지만 같은 점수가 2개 더 있으므로, 유일한 최저점이 아닙니다. 따라서, 평균을 구할 때 제외하지 않습니다.
    • 4번 학생의 평균 점수는 (65+77+67+65+65) / 5 = 67.8입니다.

제외할 점수는 제외하고 평균을 구한 후, 아래 기준에 따라 학점을 부여합니다.

평균학점

90점 이상 A
80점 이상 90점 미만 B
70점 이상 80점 미만 C
50점 이상 70점 미만 D
50점 미만 F

학생들의 점수가 담긴 정수형 2차원 배열 scores가 매개변수로 주어집니다. 이때, 학생들의 학점을 구하여 하나의 문자열로 만들어서 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ scores의 행의 길이(학생 수) ≤ 10
  • scores의 열의 길이 = scores의 행의 길이
    • 즉, scores는 행과 열의 길이가 같은 2차원 배열입니다.
  • 0 ≤ scores의 원소 ≤ 100
  • return 값 형식
    • 0번 학생의 학점부터 차례대로 이어 붙인 하나의 문자열을 return 합니다.

입출력 예

scoresresult

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD"
[[50,90],[50,87]] "DA"
[[70,49,90],[68,50,38],[73,31,100]] "CFD"

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

 

입출력 예 #2

No. 0 1
0 50 90
1 50 87
평균 50 90
학점 D A
  • 1번 학생이 자기 자신을 평가한 87점은 [90, 87]에서 유일한 최저점이므로, 평균을 구할 때 제외합니다.

입출력 예 #3

No. 0 1 2
0 70 49 90
1 68 50 38
2 73 31 100
평균 70.33… 40 64
학점 C F D
  • 1번 학생이 자기 자신을 평가한 50점은 [49, 50, 31]에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.
  • 2번 학생이 자기 자신을 평가한 100점은 [90, 38, 100]에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.

 


>문제 풀이

 프로그래머스 위클리 문제를 풀어보는 중인데 오늘은 2주차 문제를 풀어보았습니다.

레벨 1이라 쉬운 문제였습니다.

방법으로는 여러가지가 있겠지만, 어차피 입력값이 크지도 않고 해서 짧게 짜보았습니다.

방법으로는

1) scores[] 배열을 만들어서 열을 넣은 다음 정렬 -> 최소값이 자기평가 값과 같으면서 유일하거나 최대값이 자기평가 값과 같으면서 유일하면 sum에서 자기평가값을 빼주고 len-1로 나눠 avg를 구해줍니다.

조건에 해당되지 않으면 avg=sum/len;

2) min, max에 해당열의 최소, 최대값을 담고, 자기평가 값과 같은 값이 몇개인지 cnt로 카운팅해서 조건을 판별합니다. min==자기평가 값이고 cnt==1 이거나, max==자기평가 값이면서 cnt==1이면 sum-=scores[i][i]; avg=sum/(len-1)을 해줍니다.

조건에 해당되지 않으면 avg=sum/len;

근데, 적어놓고보니 2번이 더 빠를 것 같습니다..ㅎㅎ;

 

>전체 코드

 

import java.util.Arrays;
class Solution {
    public String solution(int[][] scores) {
        String answer = "";
        int sum, avg, len= scores.length;
        int arr[]= new int[len];
        
        //자기가 받은 점수중에 자기평가 점수가 최고점 or 최저점이면 제외
        //단 유일한 최고점 or 최저점이 아니라 동점이 있으면 제외안함
        for(int i=0; i<len; i++){
            sum=0;
            for(int j=0; j<len; j++){
                arr[j]= scores[j][i];
                sum+= arr[j];
            }
            Arrays.sort(arr);
            avg= sum/len;
            if((arr[0]==scores[i][i]&&arr[0]!=arr[1])||
               (arr[len-1]==scores[i][i]&&arr[len-1]!=arr[len-2])){
                sum-=scores[i][i];
                avg= sum/(len-1);
            }
            if(avg>=90) answer+="A";
            else if(avg>=80) answer+="B";
            else if(avg>=70) answer+="C";
            else if(avg>=50) answer+="D";
            else answer+="F";
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/83201

 

코딩테스트 연습 - 2주차_상호평가

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

[문제 설명]

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.

마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.

앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.

이전에 등장했던 단어는 사용할 수 없습니다.

한 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.

tank → kick → know → wheel → land → dream → mother → robot → tank

위 끝말잇기는 다음과 같이 진행됩니다.

1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.

2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.

3번 사람이 자신의 첫 번째 차례에 know를 말합니다.

1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.

(계속 진행)

끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.

사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.

[제한 사항]

끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.

words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.

단어의 길이는 2 이상 50 이하입니다.

모든 단어는 알파벳 소문자로만 이루어져 있습니다.

끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.

정답은 [ 번호, 차례 ] 형태로 return 해주세요.

만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

[입출력 예]

n words result
3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3]
5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]
2 ["hello", "one", "even", "never", "now", "world", "draw"] [1,3]

*입출력 예 설명

입출력 예 #1

3명의 사람이 끝말잇기에 참여하고 있습니다.

1번 사람 : tank, wheel, mother

2번 사람 : kick, land, robot

3번 사람 : know, dream, tank

와 같은 순서로 말을 하게 되며, 3번 사람이 자신의 세 번째 차례에 말한 tank라는 단어가 1번 사람이 자신의 첫 번째 차례에 말한 tank와 같으므로 3번 사람이 자신의 세 번째 차례로 말을 할 때 처음 탈락자가 나오게 됩니다.

입출력 예 #2

5명의 사람이 끝말잇기에 참여하고 있습니다.

1번 사람 : hello, recognize, gather

2번 사람 : observe, encourage, refer

3번 사람 : effect, ensure, reference

4번 사람 : take, establish, estimate

5번 사람 : either, hang, executive

와 같은 순서로 말을 하게 되며, 이 경우는 주어진 단어로만으로는 탈락자가 발생하지 않습니다. 따라서 [0, 0]을 return하면 됩니다.

입출력 예 #3

2명의 사람이 끝말잇기에 참여하고 있습니다.

1번 사람 : hello, even, now, draw

2번 사람 : one, never, world

와 같은 순서로 말을 하게 되며, 1번 사람이 자신의 세 번째 차례에 'r'로 시작하는 단어 대신, n으로 시작하는 now를 말했기 때문에 이때 처음 탈락자가 나오게 됩니다.


>문제 풀이

answer[0]은 n명 중에 몇번째 사람이 틀렸는가

answer[1]은 틀린 사람이 몇번째 대답에서 틀렸는가

1) 즉, words[i]번째 글자의 길이가 1이면 break;

2) words[i]번째 값이 이전 단어의 끝 글자로 시작하지 않으면 break;

3) 이미 말한적 있는 단어면 break;

- 중복 여부는 set<Integer>로 체크합니다.

위의 조건에 해당되지 않으면, set.add(words[i]);

조건에 해당되어 나오면 words[i]번째 값이 잘못되었다는 뜻이므로 i를 기준으로 answer[0], answer[1]를 구해줍니다.

단, words[] 값을 다 돌았는데도 틀린 사람이 없으면 [0, 0]을 반환하도록 해줍니다.

 

>전체 코드

 

import java.util.HashSet;
class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        HashSet<String> set= new HashSet<>();
        int i;
        
        set.add(words[0]);
        for(i=1; i<words.length; i++){
            if(words[i].length()==1) break;
            if(words[i-1].charAt(words[i-1].length()-1)!=words[i].charAt(0)) break;
            if(set.contains(words[i])) break;
            set.add(words[i]);
        }
        
        answer[0]=(i+1)%n==0?n:(i+1)%n;
        answer[1]=(int)Math.ceil((double)(i+1)/n);
        if(i==words.length) {
            answer[0]=0;
            answer[1]=0;
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/12981

 

코딩테스트 연습 - 영어 끝말잇기

3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3] 5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]

programmers.co.kr

 

[문제 설명]

여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다.

개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 "카카오 신입 개발자 공채" 관련 기사를 검색해보았다.

• 카카오 첫 공채..'블라인드' 방식 채용

• 카카오, 합병 후 첫 공채.. 블라인드 전형으로 개발자 채용

• 카카오, 블라인드 전형으로 신입 개발자 공채

• 카카오 공채, 신입 개발자 코딩 능력만 본다

• 카카오, 신입 공채.. "코딩 실력만 본다"

• 카카오 "코딩 능력만으로 2018 신입 개발자 뽑는다"

기사의 제목을 기준으로 "블라인드 전형"에 주목하는 기사와 "코딩 테스트"에 주목하는 기사로 나뉘는 걸 발견했다. 튜브는 이들을 각각 묶어서 보여주면 카카오 공채 관련 기사를 찾아보는 사용자에게 유용할 듯싶었다.

유사한 기사를 묶는 기준을 정하기 위해서 논문과 자료를 조사하던 튜브는 "자카드 유사도"라는 방법을 찾아냈다.

자카드 유사도는 집합 간의 유사도를 검사하는 여러 방법 중의 하나로 알려져 있다. 두 집합 A, B 사이의 자카드 유사도 J(A, B)두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값으로 정의된다.

예를 들어 집합 A = {1, 2, 3}, 집합 B = {2, 3, 4}라고 할 때, 교집합 A ∩ B = {2, 3}, 합집합 A ∪ B = {1, 2, 3, 4}이 되므로, 집합 A, B 사이의 자카드 유사도 J(A, B) = 2/4 = 0.5가 된다. 집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의한다.

자카드 유사도는 원소의 중복을 허용하는 다중집합에 대해서 확장할 수 있다. 다중집합 A는 원소 "1"을 3개 가지고 있고, 다중집합 B는 원소 "1"을 5개 가지고 있다고 하자. 이 다중집합의 교집합 A ∩ B는 원소 "1"을 min(3, 5)인 3개, 합집합 A ∪ B는 원소 "1"을 max(3, 5)인 5개 가지게 된다. 다중집합 A = {1, 1, 2, 2, 3}, 다중집합 B = {1, 2, 2, 4, 5}라고 하면, 교집합 A ∩ B = {1, 2, 2}, 합집합 A ∪ B = {1, 1, 2, 2, 3, 4, 5}가 되므로, 자카드 유사도 J(A, B) = 3/7, 약 0.42가 된다.

이를 이용하여 문자열 사이의 유사도를 계산하는데 이용할 수 있다. 문자열 "FRANCE"와 "FRENCH"가 주어졌을 때, 이를 두 글자씩 끊어서 다중집합을 만들 수 있다. 각각 {FR, RA, AN, NC, CE}, {FR, RE, EN, NC, CH}가 되며, 교집합은 {FR, NC}, 합집합은 {FR, RA, AN, NC, CE, RE, EN, CH}가 되므로, 두 문자열 사이의 자카드 유사도 J("FRANCE", "FRENCH") = 2/8 = 0.25가 된다.

[입력 형식]

입력으로는 str1str2의 두 문자열이 들어온다. 각 문자열의 길이는 2 이상, 1,000 이하이다.

입력으로 들어온 문자열은 두 글자씩 끊어서 다중집합의 원소로 만든다. 이때 영문자로 된 글자 쌍만 유효하고, 기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다. 예를 들어 "ab+"가 입력으로 들어오면, "ab"만 다중집합의 원소로 삼고, "b+"는 버린다.

다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. "AB"와 "Ab", "ab"는 같은 원소로 취급한다.

[출력 형식]

입력으로 들어온 두 문자열의 자카드 유사도를 출력한다. 유사도 값은 0에서 1 사이의 실수이므로, 이를 다루기 쉽도록 65536을 곱한 후에 소수점 아래를 버리고 정수부만 출력한다.

[예제 입출력]

str1 str2 answer
FRANCE french 16384
handshake shake hands 65536
aa1+aa2 AAAA12 43690
E=M*C^2 e=m*c^2 65536

 


>문제 풀이

주어진 문자열 str1, str2 사이의 유사도를 찾는 문제였습니다.

소문자와 대문자를 구분하지 않기 때문에 str1과 str2를 소문자 또는 대문자로 맞춰주는 작업을 해줘야합니다.

그리고 char 2개씩 잘라서 array list에 넣어주는데, 이때 구성 문자가 알파벳이 아니라면 넣지 않습니다.

그리고 교집합 개수와(intersection) 합집합 개수를(union) 구해줍니다.

자카드 유사도= intersection/union

우리는 (자카드 유사도)*65536 을 소수점 부분을 버리고 리턴해주면 됩니다.

단, 집합 A와 B가 모두 공집합일 경우 자카드 유사도가 1인 것을 처리해주어야 합니다.

 

>전체 코드

 

import java.util.ArrayList;
class Solution {
    public int solution(String str1, String str2) {
        int answer = 0, intersection=0, union=0;
		ArrayList<String> list1= new ArrayList<>();
		ArrayList<String> list2= new ArrayList<>();
		
		str1= str1.toUpperCase();
		str2= str2.toUpperCase();
		
		String temp;
		for(int i=0; i<str1.length()-1; i++) { //str1
			temp= str1.substring(i, i+2);
			if(!temp.matches("^[A-Z]*$")) continue;
			list1.add(temp);
		}
		
		for(int i=0; i<str2.length()-1; i++) { //str2
			temp= str2.substring(i, i+2);
			if(!temp.matches("^[A-Z]*$")) continue;
			list2.add(temp);
		}
		
		for(String s: list1) {
			if(list2.remove(s)) intersection++;
			union++;
		}
		
		for(String s: list2) {
			union++;
		}
		
		answer=(int)Math.floor((double)intersection/union*65536);
        if(list1.size()==0&&list2.size()==0) answer=65536;
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/17677

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

 

[문제 설명]

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

[제한사항]

n은 1 이상 1,000 이하입니다.

[입출력 예]

n result
4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

>문제 풀이

삼각형 모양을 배열에 왼쪽 정렬로 담는다고 생각합니다.

그럼 아래 그림의 우측 그림처럼 값이 들어가야겠죠.

이렇게 되면, 3가지 동작으로 이동하면서 idx++값이 들어가게 됩니다.

이동 횟수는 dx[0][0]~dx[5][0]까지 6번 아래로, 5칸 오른쪽, 대각선 4칸, 아래 3칸, 오른쪽 2칸, 대각선 1칸으로 n--로 반복하게 됩니다.

 

 

>전체 코드

 

class Solution {
    public int[] solution(int n) {
        int[] answer = new int[n*(n+1)/2];
        int[][] mat= new int[n][n];
        
        int x=-1, y=0, idx=1;
        for(int i=0; i<n; i++){
            for(int j=i; j<n; j++){
                if(i%3==0){ //아래로
                    x++;
                }else if(i%3==1){//오른쪽으로
                    y++;
                }else{//대각선으로
                    x--;
                    y--;
                }
                mat[x][y]= idx++;
            }
        }
        
        idx=0;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(mat[i][j]==0) break;
                answer[idx++]= mat[i][j];
            }
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

 

 

*참고한 블로그

https://minhamina.tistory.com/58

 

[프로그래머스 - Java] 삼각 달팽이(월간 코드 챌린지 시즌1)

문제 programmers.co.kr/learn/courses/30/lessons/68645 코딩테스트 연습 - 삼각 달팽이 5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11] programmers.co.k..

minhamina.tistory.com

[문제설명]

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

• (a1, a2, a3, ..., an)

튜플은 다음과 같은 성질을 가지고 있습니다.

1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)

2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)

3. 튜플의 원소 개수는 유한합니다.

원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

• {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는

• {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

와 같이 표현할 수 있습니다.

이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

• {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

• {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}

• {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}

는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

[제한사항]

s의 길이는 5 이상 1,000,000 이하입니다.

s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.

숫자가 0으로 시작하는 경우는 없습니다.

s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.

s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.

return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.

[입출력 예]

s result
"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4]
"{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4]
"{{20,111},{111}}" [111, 20]
"{{123}}" [123]
"{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

* 입출력 예에 대한 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

문제 예시와 같습니다.

입출력 예 #3

(111, 20)을 집합 기호를 이용해 표현하면 {{111}, {111,20}}이 되며, 이는 {{20,111},{111}}과 같습니다.

입출력 예 #4

(123)을 집합 기호를 이용해 표현하면 {{123}} 입니다.

입출력 예 #5

(3, 2, 4, 1)을 집합 기호를 이용해 표현하면 {{3},{3,2},{3,2,4},{3,2,4,1}}이 되며, 이는 {{4,2,3},{3},{2,3,4,1},{2,3}}과 같습니다.


>문제 풀이

 

s= {{2, 1, 3}, {2}, {2, 1}, {2, 1, 3, 4}};

1. 주어진 문자열을 쪼갠다.

arr[0]= "{2, 1, 3}"

arr[1]= "{2}"

arr[2]= "{2, 1}"

arr[3]= "{2, 1, 3, 4}"

2. arr를 문자열의 길이에 따라 정렬합니다.

arr[0]= "{2}"

arr[1]= "{2, 1}"

arr[2]= "{2, 1, 3}"

arr[3]= "{2, 1, 3, 4}"

3. 중복체크를 하면서 LinkedList에 넣어주고 다시 answer에 넣어줍니다.

list= 2, 1, 3, 4

answer[]={2, 1, 3, 4};

코드 개선

* 얼마전 코테 를 보면서,,

값의 들어온 순서대로 출력을 해야할 때 LinkedList를 써야한다는 것을 깨달았었다.

그래서 이번에도 LinkedList를 사용했는데, 다른분의 코드를 보고 리스트를 안써도 set을 사용해서 중복 체크만 하고 바로 answer[]에 넣어도 된다는 걸 알았다.

그래서 위에서는 1)s.split 및 정렬 // 2)중복체크 해서 list만들기 // 3)list를 다시 answer로 옮겨주기 3단계로 구현했지만, 아래의 로직이면 3)번 과정을 없앨 수 있다.

HashSet<Integer> set= new HashSet<>();
//String s를 split하고//
answer= new int[arr.length];

for(int i=0; i<arr.length; i++){
    String[] tuple= arr[i].split(",");
    for(int j=0; j<tuple.length; j++){
        if(!set.contains(Integer.parseInt(tuple[j])))
            answer[idx++]= Integer.parseInt(tuple[j]);
    }
}

근데 나는 s를 split해서 arr에 넣을때 "" 값이 들어가 있었기 때문에, 위의 방법으로 answer의 크기를 미리 지정해주려면 split 코드를 약간 수정해서 넣어야 할 것 같다.


+) 정렬 코드도 이런식으로 개선 할 수 있다.

Arrays.sort(arr, new Comparator<String>(){
    public int compare(String s1, String s2){
        return s1.length()-s2.length();
    }
});

//위의 코드를 아래처럼 수정 가능
Arrays.sort(arr, (s1, s2)->{return s1.length()-s2.length();});

 

>전체 코드

 

import java.util.*;
class Solution {
    public int[] solution(String s) {
        int idx=0;
        int[] answer = {};
        LinkedList<Integer> list= new LinkedList<>();
        
        String[] arr= s.split("\\{|\\},\\{|\\}");
        
        Arrays.sort(arr, new Comparator<String>(){
            public int compare(String s1, String s2){
                return s1.length()-s2.length();
            }
        });
        
        for(int i=0; i<arr.length; i++){
            if(arr[i].equals("")) continue;
            String[] tuple= arr[i].split(",");
            for(int j=0; j<tuple.length; j++){
                if(!list.contains(Integer.parseInt(tuple[j])))
                    list.add(Integer.parseInt(tuple[j]));
            }
        }
        
        answer= new int[list.size()];
        for(int i=0; i<list.size(); i++){
            answer[i]= list.get(i);
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/64065

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

 

+ Recent posts