본문 바로가기
개발일지/알고리즘

[programmers] 나머지 한 점(C#)

by 쫌눈 2022. 6. 23.
반응형

문제 설명

직사각형을 만드는 데 필요한 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]

입출력 예 설명

입출력 예 #1
세 점이 [1, 4], [3, 4], [3, 10] 위치에 있을 때, [1, 10]에 점이 위치하면 직사각형이 됩니다.

입출력 예 #2
세 점이 [1, 1], [2, 2], [1, 2] 위치에 있을 때, [2, 1]에 점이 위치하면 직사각형이 됩니다.

위의 문제를 해석하자면, x와 y의 좌표에서 한번씩만 나온 값이 나머지 한 점의 좌표가 되는 것이다.

내가 사용한 코드

using System;

class Solution
{
    public int[] solution(int[,] v)
    {
        int[] answer={0,0};

        if(v[0,0] == v[1,0]){
            answer[0] = v[2,0];
        }else if (v[0,0] == v[2,0]){
            answer[0] = v[1,0];
        }else if (v[1,0] == v[2,0]){
            answer[0] = v[0,0];
        }
        
        if(v[0,1] == v[1,1]){
            answer[1] = v[2,1];
        }else if (v[0,1] == v[2,1]){
            answer[1] = v[1,1];
        }else if (v[1,1] == v[2,1]){
            answer[1] = v[0,1];
        }

        return answer;
    }
}

처음에는 위와 같이 짰다.
근데,,, 반복되는게 너무 꼴보기가..싫은것이다.
그래서 아래와 같이 변경을 했다.

using System;

class Solution
{
    public int[] solution(int[,] v)
    {
        int[] answer={0,0};
        
        for(int i = 0; i < 2; i++){
            if(v[0,i] == v[1,i]){
                answer[i] = v[2,i];
            }else if (v[0,i] == v[2,i]){
                answer[i] = v[1,i];
            }else if (v[1,i] == v[2,i]){
                answer[i] = v[0,i];
            }
        }

        return answer;
    }
}

정확성 : 100.0

좀더 심플해졌다는 생각에 기분이 좋았다. 하지만 여전히 상수가 조건문에 있다는게 너무 싫었다.

그래도 내가 생각한 최선은 이거라 생각하며 제출을 하고 다른사람의 풀이를 봤는데..

세상에 비트 연산자를 쓰더라..심지어 코드가 엄청 간결...ㅠ,,,,,

비트연산은 진짜 코딩 처음배울때..? 사용했었던 부분이라..기억도 나지 않았다.

그래서 나도 공부할 겸.. 비트 연산자를 사용한 풀이 방법을 보여주도록 하겠다.

using System;

class Solution
{
    public int[] solution(int[,] v)
    {
        int[] answer={0,0};

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

        return answer;
    }
}

이 코드다.

진짜 너무 간결하지 않는가..?

사용할 것은 XOR연산으로 연산을 하는 두개의 비트가 같으면 같은 값을, 다르면 다른 값을 반환한다.

그러므로 answer[0] = v[0,0] ^ v[1,0] ^ v[2,0]; 여기서 하나의 점만 다른 값이 나올 것이다.

그게 좌표가 되는 것이다.

비트연산자... 다시 되새기고 가자...

 

 

도움이 되셨다면 공감버튼을 눌러주세요.🥰

반응형

댓글