2021. 6. 24. 02:15ㆍdev
최근 코딩테스트 데모 예제로 나왔던 문제이다.
https://programmers.co.kr/learn/courses/18/lessons/1878
세개의 좌표가 입력으로 들어오고, 직사각형을 만들기 위해서 나머지 한개의 좌표를 찾는 문제이다.
직사각형의 각 변이 x, y축과 평행하고, 세 점을 그려보면 x와 y에서 한번씩만 나온 값의 좌표가 결과값을 갖게된다.
정답 코드
def solution(v):
# x, y좌표가 들어갈 리스트
x = []
y = []
answer = []
# 이중배열 순회
for i in v:
if i[0] not in x:
x.append(i[0])
else:
x.remove(i[0])
if i[1] not in y:
y.append(i[1])
else:
y.remove(i[1])
answer = x + y
return answer
x와 y 좌표들을 각각 따로 리스트 만들어주고, 하나씩 순회한다.
이때, 리스트에 들어있지 않은 좌표라면 해당 좌표 리스트에 삽입시켜주고, 아니라면 (이미 들어있는 값이라면) 리스트에서 제거한다.
이렇게하면 최종적으로 중복값이 없는 하나의 좌표만 각각 남아있게 된다.
다른사람 풀이
1. 람다 표현법
def solution(v):
answer = []
x = sorted(list(map(lambda x:x[0], v)))
y = sorted(list(map(lambda y:y[1], v)))
if (x[0] != x[1]):
answer.append(x[0])
elif (x[0] == x[1]) :
answer.append(x[2])
if (y[0] != y[1]) :
answer.append(y[0])
elif(y[0] == y[1]):
answer.append(y[2])
return answer
람다로 풀고싶었는데 아직은 익숙하지 않아서 실패..!
입력 배열 v에서 x와 y값 각각을 정렬시켜주기 위해 위처럼 람다를 사용했고
각 리스트의 값들은 인덱스 0, 1, 2를 가지게 될텐데 이때, 처음부터 비교 탐색해서 두개의 값이 같다면
다른 한개의 값을 append, 다르다면 첫번째 인덱스의 값을 append 시킨다. (정렬했으므로 나머지 두개가 같은 값이 된다.)
2. xor 사용
def solution(pos):
x = pos[0][0] ^ pos[1][0] ^ pos[2][0]
y = pos[0][1] ^ pos[1][1] ^ pos[2][1]
return [x,y]
비트연산자 XOR을 사용해서 풀이한 방법이다. 비트연산으로 풀거라고 생각도 못했는데..!
어떤 원리냐면, 같은값 2개와 다른값 1개를 xor 연산시키면 다른값 1개가 반환된다는 원리이다.
a ^ a = 0
a ^ a ^ b = b
3. count() 사용
def solution(v):
# x, y좌표가 들어갈 리스트
x = []
y = []
# 입력된 이중 리스트 탐색
for i in v:
x.append(i[0])
y.append(i[1])
# x좌표 리스트에 똑같은 값이 두개있다면
if x.count(i[0]) == 2:
# set()을 사용해 중복을 제거, list로 변환후 제거한다
x = list(set(x))
x.remove(i[0])
# y좌표: x와 동일하게 수행
if y.count(i[1]) == 2:
y = list(set(y))
y.remove(i[1])
# x와 y리스트 연결
x.extend(y)
return x
여기서는 단순히 count()를 사용했지만, collections 모듈의 Counter 객체를 불러와도 된다.
입력되는 3개의 좌표중에서 x와 y가 각각 똑같은 값이 2개인 값이 있다.
이들을 제거하면 나머지 한점의 좌표가 나오게 되는것.
그리고 여기서 extend()를 사용했는데 x.extend(y) 하게되면 x리스트 안에 y원소들을 오른쪽 끝에 삽입하는것.
참고블로그: https://m.blog.naver.com/wideeyed/221541104629
입력 좌표가 세개뿐이라 비트연산자로 풀이한 방법이 가장 간단했다.. 조건문도 하나도 안쓰고,,! 👀
'dev' 카테고리의 다른 글
Python 딕셔너리 자료형 (0) | 2021.08.18 |
---|---|
[프로그래머스] 오픈채팅방 (Python) (0) | 2021.08.13 |
VS Code 단축키 모음 (0) | 2021.06.05 |
백준 9095: 1,2,3 더하기 (DP) (0) | 2021.05.31 |
백준 10826: 피보나치 수 4 (DP) (0) | 2021.05.31 |