sumichip4035   2년 전

list가 int로는 계산이 안돼서 오류가 나는 것임은 알지만

이런식으로 조금씩 빌드업해나가면서 코드를 짜는 편인데 list를 int의 형식을 맞추는게 너무 어렵습니다. 매번 map,split이나 sys.stdin.readline 을 사용해도 typeerror가 나오고요. int와 list 문제를 해결한다고 제가 생각한 문제 해결 방법을 완전히 바꾸지 않고, 제가 생각한 해결 방법에서 자연스럽게 코드를 짤 수는 없는걸까요? 조금만 달라도 에러가 나는데 list를 int 형변환이나 list안에 for문을 넣어 돌린다는 등의 문제 안에서 자유자재로 쓰려면 어떤식으로 공부해야할까요? 

list를 다루는 방식에 대한 구글링을 해보면 보통 문제가 아니라 간단한 예제에서 리스트를 만드는 방법이 나오는데, 문제해결할 때와는 많이 다른 것 같습니다. list를 응용해서 문제를 풀어보고 싶은데, 문제를 풀 때 list 부분에서 계속 오류가 나지만, list개념을 본다고 부족한 게 아닌데, 도대체 어느 부분에서 제가 이해가 안된 건지, list, tuple, range를 좀 편하게 잘 녹여내려면 어떤식으로 공부를 하면 좋을지 조언 부탁드립니다. 

문제를 풀다가 질문이 생겼는데, 질문 형태는 공부 조언인 것 같아 이 질문글이 적절치 못하다면 내리겠습니다. 

onart   2년 전

첨부된 코드는 수를 하나씩 생성해서 1~10000 정수와의 차집합을 구하겠다는 의미 같은데요. 동적 타이핑, 참조, 순수 객체 지향이란 개념에 대한 이해부터 더 필요할 것 같습니다. 이 문제와 큰 관련은 없지만 중요한 걸 덧붙이자면 리터럴이란 개념도 잡아 두세요.

3행.

- 정수/실수 간 나눗셈의 결과는 항상 실수입니다. python에서 정수-실수의 상등을 비교할 경우 값이 같다면 인정해 주긴 하지만, 나누어떨어지지 않는 경우 위에 적은 의미대로 되지 않을 수밖에 없습니다. 예를 들어 n=1인 경우 n+(n/1000) + (n/100) + (n/10) + (n%10)=2.1109999999999998입니다. num과 겹칠 리가 없죠. (실제 값은 2.111이지만 부동소수점 정밀도 한계) 다른 언어에서 주로 제공되는 몫 연산은 python에서는 //입니다. 1/2=0.5, 1//2=0

- list의 생성자(초기화자)로 들어갈 수 있는 것은 iterable뿐입니다. 이 문장에서 모르는 말이 나온 경우, list개념을 본다고 부족한 게 맞습니다.

- python의 = 연산자는 참조를 새것으로 대체한다는 의미입니다. 위에 적힌 게 의도가 맞다면, 루프 전에 리스트를 하나 만들고 append 메소드를 통해 삽입해야 합니다. 참고로 =과 대입의 차이는 다음과 같습니다. a=[1,2,3];b=a를 한 후 a[0]=3을 하고 b를 확인하면 똑같이 맨 앞이 3으로 바뀌는데, b=1을 수행한다고 a가 1이 되지는 않습니다. 대입이 가능한 건 멤버 내지 객체 내 항목뿐인데, 이를 잘 이해하려면 참조라는 개념을 잘 알아두셔야 합니다. 여기서 더 설명해 봐야 더 헷갈려하실 것 같습니다.

4행.

- remove는 리스트에서 원하는 값과 일치하는 것 중 가장 앞에 있는 것을 제거합니다. 3행을 의도대로 잘 지나왔다면, cons는 [0,2,4,...]일 텐데 num에 이것이 있을 리가 없습니다. 값별 비교가 아니고 num의 한 원소로 저런 리스트가 있어야 지워지는 겁니다. 위의 의도대로 차집합으로 풀고자 한다면 set(집합) 객체가 필요하며, 이는 list와 같이 iterable로 만들 수 있습니다. 모두 설명하진 않겠습니다. 차집합의 경우 멤버함수 difference 혹은 연산자 -로 구할 수 있게 되어 있습니다. set 쓰기 싫으면 인덱스 2개를 사용하는 반복문으로 중복 검사를 계속 해야죠.

5행.

set을 출력할 경우 한 줄에 하나씩 나오는 게 아니라 {1, 2, 3} <= 이런 형태로 나옵니다. 참고로 set은 해시 함수를 사용하며 이것이 iterator가 순회하는 순서를 어떻게 할지 알기는 어려우므로, 정렬된 결과를 원하는 이 문제에서 그대로 사용할 수 없습니다.

특히나 python과 같은 동적 타이핑 언어는 본인이 이해했다고 생각해도 사실 아닌 경우가 많습니다. 기본부터 차근차근 다시 하는 게 가장 좋아 보입니다. 작성자분은 문제 해결할 때와 많이 다른 것 같다고 써 주셨는데, 제가 섣불리 추측해 보자면 프로그래밍 언어를 익히면서 문제를 풀고 계신 것 같습니다. 오개념을 가지고 있는 이상, 지금 알고리즘 문제를 푸는 건 그리 좋은 생각이 아닙니다.

sumichip4035   2년 전

정성스러운 답변 정말 감사합니다. 이 질문을 지금이라도 해서 정말 다행이라는 생각이 듭니다. 

행별로 이유를 들어 설명하셔서 제가 어느정도로 개념이 많이 부족한지 알게되었습니다. 

책으로 빠르게 개념을 보고 문제마다 어떻게 적용되는지 그 예시들을 보고 대입하는 식으로 코드를 짰었는데, 개념이 부족했다면 이런 식으로 짜진 않았겠죠.

list 개념도 부족하지만 그보다 구조적 상위개념이 많이 부족한 것 같습니다. 

행마다 어떤 개념이 부족한지를 간접적으로 알 수 있게 디테일하게 답변해주셔서 정말 감사합니다.  조언해주신대로 더 꼼꼼히 짚어야겠습니다. 정말 감사합니다. 

댓글을 작성하려면 로그인해야 합니다.