개발자는 기록이 답이다

[프로그래머스][Java][모의테스트] 나머지 한 점 본문

알고리즘/프로그래머스

[프로그래머스][Java][모의테스트] 나머지 한 점

slow-walker 2023. 10. 3. 10:55

 

 

https://school.programmers.co.kr/learn/courses/18/lessons/1878

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명


직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.

제한사항

  • v는 세 점의 좌표가 들어있는 2차원 배열입니다.
  • v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다.
  • 좌표값은 1 이상 10억 이하의 자연수입니다.
  • 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요.

입출력 예

v result
[[1,4],[3,4],[3,10]] [1,10]
[[1,1],[2,2],[1,2]] [2,1]

 

내가 푼 풀이

좌표문제는 항상 겁부터 먹기 시작해서 그런걸까

제출하니까 성공이긴 한데, 입력이 정해져 있는데 왜 이렇게 어렵게 풀었는지 모르겠다..

어차피 x좌표 3개 중에 쌍으로 같은 좌표를 갖고 있다. 그래서 동일하지 않은 1개 좌표가  출력되고,y좌표도 마찬가지인데...

import java.util.*;
class Solution {

    public int[] solution(int[][] v) {
        int[] answer = new int[2];
        ArrayList<Integer> x = new ArrayList<>();
        ArrayList<Integer> y = new ArrayList<>();
        for (int i = 0; i < v.length; i++) {
            x.add(v[i][0]);
        }
        for (int i = 0; i < v.length; i++) {
            y.add(v[i][1]);
        }
        Collections.sort(x);
        Collections.sort(y);
        for (int i = 0; i < x.size()-1; i++) {
            if (x.get(i).equals(x.get(i+1)) && i == 1) answer[0] = x.get(0);
            else if (x.get(i).equals(x.get(i+1)) && i != 1) answer[0] = x.get(2);
        }
        for (int i = 0; i < y.size()-1; i++) {
            if (y.get(i).equals(y.get(i + 1)) && i == 1) answer[1] = y.get(0);
            else if (y.get(i).equals(y.get(i+1)) && i != 1) answer[1] = y.get(2);

        }
        return answer;
    }
}
테스트 1 통과 (0.22ms, 78.6MB)
테스트 2 통과 (0.21ms, 83MB)
테스트 3 통과 (0.23ms, 73MB)
테스트 4 통과 (0.19ms, 73.2MB)
테스트 5 통과 (0.22ms, 75.9MB)
테스트 6 통과 (0.21ms, 76.5MB)
테스트 7 통과 (0.21ms, 77.3MB)
테스트 8 통과 (0.21ms, 80.1MB)
테스트 9 통과 (0.23ms, 71.9MB)
테스트 10 통과 (0.22ms, 75.9MB)
테스트 11 통과 (0.20ms, 77.4MB)
테스트 12 통과 (0.23ms, 73MB)
테스트 13 통과 (0.32ms, 72.4MB)
테스트 14 통과 (0.21ms, 72.4MB)
테스트 15 통과 (0.20ms, 73.8MB)
테스트 16 통과 (0.32ms, 77.1MB)
테스트 17 통과 (0.21ms, 76.6MB)
테스트 18 통과 (0.20ms, 70.6MB)
테스트 19 통과 (0.29ms, 70.7MB)
테스트 20 통과 (0.37ms, 79.8MB)
테스트 21 통과 (0.27ms, 73.5MB)
테스트 22 통과 (0.27ms, 73.3MB)
테스트 23 통과 (0.27ms, 77.4MB)

 

다른 풀이 1

class Solution {
    public int[] solution(int[][] v) {
        int x;
        int y;

        if(v[0][0]==v[2][0]){
            x=v[1][0];
        }else if(v[1][0]==v[2][0]){
            x=v[0][0];
        }else{
            x=v[2][0];
        }
       
        if(v[0][1]==v[1][1]){
            y=v[2][1];
        }else if(v[1][1]==v[2][1]){
            y=v[0][1];
        }else{
            y=v[1][1];
        }

        int[] answer = {x,y};
        return answer;
    }
}
테스트 1 통과 (0.02ms, 73.1MB)
테스트 2 통과 (0.02ms, 77MB)
테스트 3 통과 (0.01ms, 75MB)
테스트 4 통과 (0.01ms, 69.2MB)
테스트 5 통과 (0.01ms, 79.5MB)
테스트 6 통과 (0.02ms, 78.4MB)
테스트 7 통과 (0.01ms, 70.9MB)
테스트 8 통과 (0.01ms, 77.5MB)
테스트 9 통과 (0.01ms, 78.6MB)
테스트 10 통과 (0.02ms, 74.8MB)
테스트 11 통과 (0.02ms, 75.5MB)
테스트 12 통과 (0.01ms, 77.6MB)
테스트 13 통과 (0.02ms, 73.8MB)
테스트 14 통과 (0.01ms, 76.6MB)
테스트 15 통과 (0.03ms, 77.3MB)
테스트 16 통과 (0.01ms, 72.7MB)
테스트 17 통과 (0.01ms, 71.8MB)
테스트 18 통과 (0.02ms, 75.2MB)
테스트 19 통과 (0.01ms, 75.9MB)
테스트 20 통과 (0.03ms, 79MB)
테스트 21 통과 (0.02ms, 77MB)
테스트 22 통과 (0.01ms, 78.4MB)
테스트 23 통과 (0.02ms, 83.5MB)

 

다른 풀이 2 해설 포함 - XOR연산자 활용

XOR(Exclusive OR)은 논리 연산자 중 하나로, 두 개의 논리 값(참 또는 거짓)을 입력으로 받아서 다음과 같은 규칙에 따라 결과를 계산합니다:

두 입력 값이 서로 다르면 XOR의 결과는 참(true)입니다.
두 입력 값이 같으면 XOR의 결과는 거짓(false)입니다.
자바에서 XOR 연산은 ^ 기호를 사용하여 수행됩니다. 

 

  • A xor A = 0
  • A xor A xor B = B
    • 같은 값 2개와 다른값 하나를 모두 XOR하면 다른 값 하나가 나온다.

  • x1이 두번 나왔다면
    • x1 xor x1 xor x2 = x2
  • y2가 두 번 나왔다면
    • y1 xor y2 xor y2 = y1
class Solution {
    public int[] solution(int[][] v) {
        int[] answer = new int[2];
        for(int i = 0; i <3; i++) {
            answer[0] ^= v[i][0];
            answer[1] ^= v[i][1];
        }
        return answer;
    }
}
테스트 1 통과 (0.02ms, 64.3MB)
테스트 2 통과 (0.02ms, 77.1MB)
테스트 3 통과 (0.01ms, 78.7MB)
테스트 4 통과 (0.54ms, 66.2MB)
테스트 5 통과 (0.01ms, 78.4MB)
테스트 6 통과 (0.01ms, 79.7MB)
테스트 7 통과 (0.02ms, 74.5MB)
테스트 8 통과 (0.01ms, 74.1MB)
테스트 9 통과 (0.01ms, 74.6MB)
테스트 10 통과 (0.01ms, 67.3MB)
테스트 11 통과 (0.02ms, 93MB)
테스트 12 통과 (0.02ms, 76.7MB)
테스트 13 통과 (0.02ms, 74.4MB)
테스트 14 통과 (0.01ms, 77.6MB)
테스트 15 통과 (0.02ms, 76.9MB)
테스트 16 통과 (0.02ms, 75.4MB)
테스트 17 통과 (0.01ms, 75MB)
테스트 18 통과 (0.02ms, 69.6MB)
테스트 19 통과 (0.01ms, 74.3MB)
테스트 20 통과 (0.01ms, 75MB)
테스트 21 통과 (0.02ms, 76.7MB)
테스트 22 통과 (0.01ms, 75.3MB)

테스트 23
통과 (0.01ms, 69.8MB)

 

다른 풀이 3  - XOR연산자 활용

class Solution {
    public int[] solution(int[][] v) {

        int[] answer = new int[2];

        answer[0] = v[0][0]^v[1][0]^v[2][0];

        answer[1] = v[0][1]^v[1][1]^v[2][1];

        return answer;
    }
}
테스트 1 통과 (0.01ms, 73.5MB)
테스트 2 통과 (0.01ms, 72.8MB)
테스트 3 통과 (0.01ms, 78.8MB)
테스트 4 통과 (0.02ms, 77.6MB)
테스트 5 통과 (0.01ms, 73MB)
테스트 6 통과 (0.03ms, 70.6MB)
테스트 7 통과 (0.01ms, 73.6MB)
테스트 8 통과 (0.01ms, 74.6MB)
테스트 9 통과 (0.02ms, 77.8MB)
테스트 10 통과 (0.02ms, 83.3MB)
테스트 11 통과 (0.02ms, 70.2MB)
테스트 12 통과 (0.01ms, 76.5MB)
테스트 13 통과 (0.02ms, 69.8MB)
테스트 14 통과 (0.02ms, 80.6MB)
테스트 15 통과 (0.02ms, 75.2MB)
테스트 16 통과 (0.02ms, 74.3MB)
테스트 17 통과 (0.01ms, 77.9MB)
테스트 18 통과 (0.01ms, 76.7MB)
테스트 19 통과 (0.02ms, 73.1MB)
테스트 20 통과 (0.02ms, 77.8MB)
테스트 21 통과 (0.01ms, 75MB)
테스트 22 통과 (0.02ms, 75.1MB)
테스트 23 통과 (0.02ms, 86.7MB)