728x90

주어진 세 선분의 두 선분 이상 겹치는 부분의 길이를 반환 

세 선분이 모두 겹쳐도 겹치는 부분은 한번만 반영된다. 

 

1번선분-2번선분

2번선분-3번선분

1번선분-3번선분 

이 겹치는 부분을 구하여 각각 겹치는 부분의 길이를 더한 후 

세 선분이 모두 겹치는 부분의 길이를 빼준다... 

 

public int solution(int[][] lines) {

int answer = 0;

List<HashSet<Integer>>lineList = new ArrayList<HashSet<Integer>>();

List<HashSet<Integer>>tempLineList = new ArrayList<HashSet<Integer>>();

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

HashSet<Integer> line = new HashSet<Integer>();

HashSet<Integer> tempLine = new HashSet<Integer>();

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

line.add(j);

tempLine.add(j);

}

lineList.add(line);

tempLineList.add(tempLine);

}

tempLineList.get(0).retainAll(lineList.get(1));

answer=(tempLineList.get(0).size()<2)?answer:answer+tempLineList.get(0).size()-1;

tempLineList.get(1).retainAll(lineList.get(2));

answer=(tempLineList.get(1).size()<2)?answer:answer+tempLineList.get(1).size()-1;

tempLineList.get(2).retainAll(lineList.get(0));

answer=(tempLineList.get(2).size()<2)?answer:answer+tempLineList.get(2).size()-1;

tempLineList.get(0).retainAll(tempLineList.get(1));

tempLineList.get(1).retainAll(tempLineList.get(2));

answer=(tempLineList.get(0).size()<2)?answer:answer-tempLineList.get(0).size()+1;

answer=(tempLineList.get(1).size()<2)?answer:answer-tempLineList.get(1).size()+1;

return answer;

}

lineList에 한 선분이 지나는 점을 가진 Set을 추가하고 추가한대로 1번 선분, 2번 선분, 3번 선분으로 부르기로한다. 

ArrayList가 아닌 Set을 사용한 이유는 중복을 허용하지 않는 Set의 retainAll 함수를 사용해 차집합을 구하기 위해서이다.

 

++집합 메서드

addAll() : 인자로 받은 set과의 합집합으로 변경 후 성공시 true 반환

retainAll() : 인자로 받은 set과의 교집합으로 변경 후 성공시 true 반환

removeAll() : 인자로 받은 set과의 차집합으로 변경 후 성공시 true 반환

containsAll() : 인자로 받은 set을 부분집합으로 가진다면 true 반환 

 

집합 메서드는 기존 집합을 인자로 받은 집합과 비교해 처리하고 기존 집합을 변경해주고 논리값을 반환해준다.

 

tempLineList를 만든 이유는 라인끼리 겹치는 부분을 비교할때마다 LineList가 변경되기 때문에 다음 비교때 문제가 생기기 때문이다.

tempLineList.get(0)에는 0번과 1번 선분이 겹치는 부분을 집합으로 가지고 

tempLineList.get(1)에는 1번과 2번 선분이 겹치는 부분을 집합으로 가지고 

tempLineList.get(2)에는 2번과 0번 선분이 겹치는 부분을 집합으로 갖는다. 

 

만약 집합이 원소를 하나만 갖는다면 한 점만 겹치고(만나고)  겹치는 부분의 길이를 갖지 못하기 때문에 

정답 answer를 계산할때 추가하면 안된다. 

그래서 size가 2이상일때만 answer 연산을 한다. 

 

세 선분이 겹치는 부분들 중 다시 겹치는 부분을 구할 때는 2번만 연산하면 되기 때문에 

겹치는 부분을 계산할때 기준 집합이 변형되도 상관없다. 

0번과 1번 선분이 겹치는 부분의 집합과 1번과 2번 선분이 겹치는 부분의 집합의 교집합 ,

1번과 2번 선분이 겹치는 부분의 집합과 2번과 0번 선분이 겹치는 부분의 집합의 교집합을 

구해 answer에서 빼준다. 

 

다른 사람의 풀이 중 map을 이용

public int solution2(int[][] lines) {

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

 

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

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

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

}

}

 

int answer = 0;

 

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {

if (entry.getValue() >= 2) {

answer++;

}

}

 

return answer;

}

 map에 각 선분의 시작점부터 끝점까지 지나가는 점을 key로 하여 중복되는 개수를 구한다. 

만약 2번이상 중복되면 answer를 증가시킨다. 

하나의 키값을 갖는 점이 3번 중복되더라도 answer는 한번만 증가하기 때문에 계산이 쉽다. 

 

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

연속된 수의 합 문제풀이  (0) 2023.09.17
안전지대 문제풀이  (0) 2023.09.17
이진수 더하기 문제풀이  (0) 2023.09.17
한번만 등장한 문자 문제풀이  (0) 2023.09.17
등수 매기기 문제풀이  (0) 2023.09.15
728x90

주어진 2진수 문자열 2개를 더한 값을 2진수로 반환 

 

1. 2진수를 10진수로 변환하여 더한 후 2진수로 변환하여 반환

public String solution(String bin1, String bin2) {

String answer = "";

int sum=Integer.parseInt(bin1,2)+Integer.parseInt(bin2,2);

answer=Integer.toBinaryString(sum);

return answer;

}

Integer 클래스에서 문자열을 정수로 바꾸어주는 parseInt를 활용

parseInt("숫자문자열",2); 

두번째 파라메터는 변환할 진수를 나타낸다. 2진수로 변환하기 위해 2 입력

 

 Integer 클래스에 toBinaryString() 메서드는 10진수를 2진수로 변환 

 

++

toOctalString() 은 8진수로 

toHexaString() 은 16진수로 변환한다. 

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

안전지대 문제풀이  (0) 2023.09.17
겹치는 선분의 길이 문제풀이  (0) 2023.09.17
한번만 등장한 문자 문제풀이  (0) 2023.09.17
등수 매기기 문제풀이  (0) 2023.09.15
삼각형의 완성조건(2) 문제풀이  (0) 2023.09.15
728x90

주어진 문자열에서 한번만 등장한 문자를 모아 사전순으로 배열한 문자열을 반환 

 

1. map으로 문자열이 가진 문자들의 개수를 구해서 개수가 1인 것만 정렬하여 반환

 

public String solution2(String s) {

String answer="";

char[] chars = s.toCharArray();

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

for(char c : chars){

charMap.put(c, charMap.getOrDefault(c, 0) +1);

}

 

for(char c : charMap.keySet()){

if( charMap.get(c) == 1){

answer+=c;

}

}

char[] ca = answer.toCharArray();

Arrays.sort(ca);

return new String(ca);

}

 

2. replaceAll() 메서드를 사용했을 때 변화한 길이가 1인 것만 정렬하여 반환

 

public String solution(String s) {

String answer = "";

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

int fLen = s.length();

char c = s.charAt(i);

s=s.replaceAll(s.charAt(i)+"", "");

if(fLen-s.length()==1) {

answer+=c;

}

i--;

}

char[] ca=answer.toCharArray();

Arrays.sort(ca);

answer=String.valueOf(ca);

return answer;

}

문자의 개수를 알기위해 replaceAll()를 사용하면 당시 개수를 알려한 문자도 같이 ""로 변환되기 때문에 i는 증가하고 배열은 감소하여 모든 index를 검사하지 못한다. 

다시 i--를 감소시켜줘야 한다. 

 

3. 다른 사람의 풀이에 좋은 풀이가 있었다.

public String solution3(String s) {

int[] alpha = new int[26];

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

alpha[c - 'a']++;

}

 

StringBuilder answer = new StringBuilder();

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

if (alpha[i] == 1) {

answer.append((char) (i + 'a'));

}

}

return answer.toString();

}

알파벳 a를 0번, z를 25번으로 하는 int 배열을 만들고 

문자열에 등장하는 문자를 찾아 해당 인덱스에 값을 1씩 증가시킨다. 

배열중 1을 원소로 하는 인덱스는 한번만 등장하는 문자로 

문자에 'a' 값을 더해줘 실제 알파벳으로 변환해준다. 

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

겹치는 선분의 길이 문제풀이  (0) 2023.09.17
이진수 더하기 문제풀이  (0) 2023.09.17
등수 매기기 문제풀이  (0) 2023.09.15
삼각형의 완성조건(2) 문제풀이  (0) 2023.09.15
영어가 싫어요 문제풀이  (0) 2023.09.14
728x90

수학, 영어 점수가 배열로 주어질때 평균으로 등수를 순서대로 반환한 배열

public int[] solution(int[][] score) {

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

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

    for(int j=0; j<score.length;j++){

         if(score[i][0]+score[i][1]<score[j][0]+score[j][1]){

    answer[i]++;

    }

}

answer[i]++;

}

return answer;

}

 이중for문으로 i번째학생의 총점보다  더 큰 학생을 만나면 rank 1증가  

 answer 원소 값은 0으로 초기화 되기 때문에 마지막 최고 rank가 1에서 시작하므로 1씩 증가 

 i와 j의 총점이 같은 경우도 rank를 증가시키면   동점자가 모두 등수가 내려간다.

 

public int[] solution2(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;

}

점수를 ArrayList에 넣고 ArrayList를 정렬하면 

index+1이 등수가 된다. 

1번 학생의 총점부터 indexOf 메서드로 인덱스를 알아내면 랭킹을 구할 수 있다.   

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

이진수 더하기 문제풀이  (0) 2023.09.17
한번만 등장한 문자 문제풀이  (0) 2023.09.17
삼각형의 완성조건(2) 문제풀이  (0) 2023.09.15
영어가 싫어요 문제풀이  (0) 2023.09.14
공 던지기 문제풀이  (0) 2023.09.14

+ Recent posts