티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/64065
2019 카카오 겨울 인턴쉽 문제중 하나랜다. 개발자가 원하는 언어로 제출할 수 있다는 점이 흥미로웠다. 파이썬을 배웠는데 파이썬을 쓰는곳이 많지않다나 하는 유튜브를 봐서 내가 쓸모없는걸 배우는데 시간을 낭비했구나 라는 생각이 들었었는데 그것도 아닌것 같다.
강의만 들어온 나로서는 실제로 문제가 주어지니까 몹시 당황스러웠다. 내가배운게 코딩맞나? 하는 의문이 씨게들어와 현탐이왔고 결국 다른사람의 코딩을 보고 분석해보면서 공부하기로 했다.
def solution(s): #솔루션을 정의해보자..
s = s [2:-2].split("},{") # 이부분부터 해석이 필요했는데 현탐왔다. 인덱스 그리고 split까지 모두 배운것이고 배울땐 마스터했다고 생각했는데 막상 써놓은걸 보니 멘붕왔다. 꾸준한 복습으로 완전히 익혀야 할 것 같다.
한가지 다행인건 코드를 해석하면서 보니 대부분 내가 배운것들이고 실전응용? 이라해야하나 직접코드를 짠 경험이 부족해서 어떻게할지 감을 못잡고 있는 것 뿐이라고 마음을 다잡았다.
먼저 [ a : b ] 인덱스 호출을 복습. index(a) ~ index(b-1)까지 불러오는것이다. b-1이라는게 중요하다.
이건 분명히 기억한다 index는 첫칸이 0으로 시작. 그러니까 s[ 2 : -2] 를 호출한 것은 입출력 예시에 있는것에서 착안한 것이었다. "{{2},{2,1},{2,1,3},{2,1,3,4}}"를 예를 들어보면 양옆의 "{ 와 }" 를 제외하고 부른다는 것이다. 따라서 해당 명령어s[2 : -2] 는 s의 2번째 index부터(인덱스는 0부터시작한다는 개념을 다시 명심) 뒤로 -3번째(b-1) 인덱스까지 불러오게되고 결과값은 2},{2,1},{2,1,3},{2,1,3,4가된다.
여기서 이제 split()함수로 규칙적을 정해 분해한다. 공통적으로 }.{가 구분선역할을 하고있는데 거슬린다. 스플릿푸쉬로 찢어버린다.
.split("},{") 을 추가하면 '2' '2,1' '2,1,3' '2,1,3,4' 가 되겠지?
여기까진 이해가 됐다. 여기서 이 분은 sorted함수를 써서 정렬해주었다. 여기서 난생 처음보는 lambda 가 튀어나왔다. lamb는 쉽새끼인것까진 알거같은데... 쉽새끼다 가 뭔뜻이지? 이거때문에 엄청헤멨다. 심지어 sorted를 굳이 해야하나? 하고 지워서 돌렸더니 맹렬하게 오답을 출력한다. 쓸모없는 줄이 있었다면 올리기전에 편집하셨겠지. 모르는게 나오면 회피하지말고 배우자. key = lambda가 뭘까? lambda가 익명함수랜다. 아 그러시구나..
https://dailyheumsi.tistory.com/67
여기서 찾았다. sorted( s, key = lambda x : x[0])을 예로들자면 s를 sorted(정렬)를 하긴하는데 뒤에 조건을 달아줘서 어떻게 정렬하는지 하는것이었다. x리스트의 0번째 인덱스를 참고해서 정렬하라~ 이런뜻이었다. 예시를 보면
c 는 a의 0번째 인덱스들을 기준으로 정렬하라고 조건을 줘서, 0번째 인덱스의 순서대로 정렬이 된 모습이다.
d 는 a의 1번째 인덱스를 기준으로 해서 또 다르게 정렬되었다.
sorted(a, key = lambda x : x[])처음배운것이니 이후에 따로 포스팅하며 복습해야겠다.
여기서 lambda는 그냥 익명함수로서 쓴것이고 별도로 함수정의해도 작동한다고 한다. 시도해보았는데 함수로 인식을 안해서 오류를 뿜어낸다. 어떻게 하는지 모르겠으니 lambda. 쉽새끼다 를 유용하게 써먹자.
쨋든 코딩테스트연습으로 돌아가서
sorted_s = sorted(s, key = lambda x : len(x)) 로 코드가 짜여진다. 내가 해석한 바에 따르면 정렬된 함수를 지정하는 sorted_s를 만들어줬고 여기에 들어가면 sorted된다. 이곳에 s값이 들어가 커스텀정렬함수로 작동을하는데, 조건을 len(x)로 주었다. len는 길이를 의미하는것이니 길이별로 정렬한다는것을 알수있다.
길이별로 왜 정렬할까? 하는 의문이 들었는데 result값과 동일하게 출력할려고 한것인가? 생각이 들었다.
그래서 sorted_s를 지우고 그냥 s로만 해결하게 수정했더니 두번째 출력에선 3이 빠졌고 네번째에선 1이빠진다.
왜그런지 아무리봐도 모르겠다. 때려 죽여도 모르겠다. 한참 코드를 만져보다가 드디어 깨달았다. break때문에 막힌거였다. break를 제거하니 sorted_s를 안하더라도 해당숫자가 들어간 튜플이 완성되었다. 왜 break를 썼을까? 를 이제 생각해봐야한다. 일단 전체코드를 완성해보자
answer = [] 를 만든다. 정답이 들어갈 빈 리스트를 만들어 정답을 넣도록 하자.
check = set() 로 체크할수 있는 함수를 만든다. 왜 set()가 check역할을 할까? 이는 set함수의 속성때문이다. 집합 자료형 set는 크게 두가지 속성을 가지는데 순서가 없고 중복이 없다는 것이다. 그래서 set함수를 check용도로 사용했다고 해석했다.
그리고 이제 answer에 집어넣을 함수를 만든다
for value in sorted_s :
for each_value in vlaue.split(",") :
if each_value not in check :
answer.append(int(each_value))
check.add(each_value)
break
return answer
for value in s : for문을 활용하여 value에 s값을 하나씩 집어넣는다. 그 값들은 다시 value.split(",")이 되어 each_value에 하나씩 집어넣어진다. ,로 스플릿했으니 숫자 하나씩 들어가는셈이다. 그리고 if문을 사용하여 만약 each_value값이 check에 없다면, answer 리스트에 each_value는 int(정수형)이 되어 들어간다. int가 필요한건 왜일까? 이건 파이썬 기초를 배울때도 int를 써야할지 말아야할지 계속 헷갈렸다. 입력값이 "어쩌고어쩌고" 라서 문자형으로 들어오기 때문에 정수형으로 바꿔 리스트에 넣을 필요가 있나보다.
여튼 answer 라는 list에 들어간 값은 set형 check에도 들어간다. set형에는 정수형은 안들어가는듯.
그리하여 if문이 중복을 걸러내는 효과를 낸다. check에 each_value값이 없다면 answer에 추가되고 그렇게 answer 리스트는 중복없이 만들어진다.
의문을 가졌던 break부분에 대해 다시 생각해보자. print(soultion("{{1,2,3},{2,1},{1,2,4,3},{2}}")) 이부분에서 3이 누락됐는데for 문 밑에 print(each_value)를 추가하여 어떤값들이 들어가는지 파악해보았다.
1 2 1 2 4 2 가 들어갔다. 원래대로라면 1 2 3 2 1 1 2 4 3 2 가 들어가야한다.
break를 삭제후 다시 돌려보았다.
1 2 3 2 1 1 2 4 3 2 로 의도대로 돌아갔다.
그러다 문득 깨달았다. break문은 애초에 sorted되어서 들어올것이라고 설계했기 때문에 집어넣은것이다. 길이에 따라서 sorted를 하면 break문으로 쓸모없는 연산을 줄일수가 있다는 것은 알겠는데 break가 정확히 어떻게 작동하는지를 모르겠다. append 됐으면 그만이다 하고 다음으로 넘어가는건가? 그럼 누락되는게 생길수도 있지않나? 모르겠다.
여튼 문제를 다시 읽어보니 원소에는 정해진 순서가 있단다.
여튼 정해진 순서가 있으므로 sorted_s는 필수적이다. 이렇게 보니 break문이 왜 하나만 넣고 만족했는지 전체적으로 파악이 갔다. 문제의 특성상 새로운 원소를 찾고 순서대로 나열하는것이 목적이고 위치랑 상관없이 새롭게 발견한 숫자를 넣는순간 해당 튜플은 검증이 끝난것이다. 새로들어간 a(n)을 찾았기 때문.
그리하여 드디어 모든 코드가 왜 들어가고 어떤 역할을 했는지 해석이 끝났다.
간단한 문제라던데 나한테는 우주탐험 그 자체다. 더 열심히 공부하자
'Python > Python' 카테고리의 다른 글
[Python] heapq로 간단하게 max heap 구현 (0) | 2020.09.23 |
---|
- Total
- Today
- Yesterday
- 배열 특정요소 제거
- 파이썬
- Vue.js강의
- heap max
- windows10 chmod 400
- bootstrap5
- 입문
- dict 연속성
- 데이터 사이언스 프로그래밍 파이썬
- 다리위를지나는트럭
- Vue.js
- Vue.js 입문
- JavaScript
- MySQL 문제
- 코딩테스트
- javascript 객체배열
- 배열 특정객체 제거
- 부트스트랩 커스텀
- vue.js 개념
- Vue.js 책
- Python
- Java수료
- vue bootstrap scss
- 프로그래머스
- Vue.js 프로젝트 투입 일주일 전
- 프로그래머스 코딩테스트
- 윈도우 chmod
- 코드잇 강의
- vue.js 특징
- chmod 400
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |