게시판
검색 결과: 20
http://pythontutor.com/visualize.html#mode=edit
소스 코드를 조금 고쳐서 파이썬 시각화 도구에서 한 단계씩 실행해보세요.
포럼 상단에 공지로 고정한 Thonny를 쓰면 로컬에서 직접 돌려보면서 확인할 수 있고, 온라인에서는 파일 읽기는 쓸 수 없으니 코드를 고쳐서 단계별로 실행하면서 내부 동작을 확인하세요. 그러면 이해가 될 겁니다.
어떻게 동작하는지 알면 버그도 발견할 수 있습니다.
아하 변수를 저장해야 한다는 중요한 걸 잊고 있었네요.
또한 변수는 앞으로 딱 봐도 뭐가 무엇을 뜻하는 지 알 수 있도록 설정하겠습니다 ㅎㅎ
좋은 답변 감사합니다!
with open('words.txt','r')as f:
words=f.readlines()
count=0
for word in words:
count+=1
word=word.strip('\n')
for i in range(((len(word))//2)):
if word[i]!=word[-1-i] :
words.pop(count-1)
break
for Palindrome in words:
print(Palindrome.strip('\n'))
선생님 말씀대로 윗 세줄을 지워도 decal은 사라지지않네요..
해설 참조해서 pop으로 리스트에서 삭제하지않고 True인것만 판별 후에 출력하니까
정답대로 회문이 잘 나오던데 이 코드에서는 왜 decal도 같이 나온건지 혹시 아시나요? 생각해봐도 모르겠어요 ㅠ 문제는 풀었는데 너무 궁금함
with open('words.txt','r')as f:
words=f.readlines()
count=0
for word in words:
count+=1
word=word.strip('\n')
for i in range(((len(word))//2)):
if word[i]!=word[-1-i] :
words[count-1]=False
break
for Palindrome in words:
if Palindrome !=False:
print(Palindrome.strip('\n'))
정답은 이렇게 제출 했습니다.
a=['apache\n','decal\n','did\n','neep\n','noon\n','refer\n','river\n']
이건 없어야 할 것 같습니다.
a=['apache\n','decal\n','did\n','neep\n','noon\n','refer\n','river\n']
with open('words.txt','w')as f:
f.writelines(a)
with open('words.txt','r')as f:
b=f.readlines()
count=0
for i in b:
count+=1
i=i.strip('\n')
for j in range(((len(i))//2)):
if i[j]!=i[-1-j] :
b.pop(count-1)
break
for x in b:
print(x.strip('\n'))
이렇게 입력하면 결과가
decal
did
noon
refer
이렇게 나오는데 왜 decal 도 함께 나오는 걸까요?
문제 설명에 strip을 하는 이유가 설명되어 있습니다.
그리고 파일에서 읽은 단어는 \n이 붙어있으므로 \n을 제외한 뒤 회문인지 판단해야 하며 단어를 출력할 때도 \n이 출력되면 안 됩니다(단어 사이에 줄바꿈이 두 번 일어나면 안 됨).
i.strip만 하면 결과가 저장되지 않습니다.
'hello\n'이 있다면
i.strip('\n')은 \n을 없앤 결과는 IDLE에서 출력하지만, 결과를 저장하지 않으니까
i는 여전히 'hello\n'입니다.
단어 리스트가 준비되었으면 for word in words:와 같이 리스트를 반복하면서 단어가 회문인지 판단합니다.
해설의 변수명은 예시입니다.
다만, for i in x보다는 for word in words가 읽기 쉽습니다.
당연히 회사에서도 후자와 같이 코딩하라고 하지, 전자와 같이 코딩하면 거절됩니다. 변수 이름은 직관적으로 지어야 합니다. 타이핑이 귀찮다고 축약해서 쓰면 이해하기도 어렵지만, 영타도 늘지 않습니다. 영타가 늘지 않으면 코딩이 느리다는 뜻이죠. 발전하지 않습니다. 의식적으로라도 영어 단어를 자주 타이핑하고, 변수명을 직관적으로 해야 합니다.
x = file.readlines()로 파일에 있는 것들 한줄로 리스트를 만들잖아요,
그 다음에
for i in x:
i.strip('\n')
if i == i[::-1]:
print(i)
로 하면 왜 잘 안되는 건가요?
저 i.strip('\n')은 꼭 변수를 지정해줘야하나요?
해설에서 변수를 지정해준 이유는 뭐죠?
심사문제 해설을 보면
여기서는 가장 간단한 시퀀스 뒤집기를 설명하겠습니다. 앞에서 단어 word를 구했으므로 word == word[::-1]과 같이 원래 문자열 word와 뒤집은 문자열 word[::-1]을 비교해서 회문인지 판별하면 됩니다. 그리고 회문인 단어를 출력하라고 했으므로 if 조건문으로 word == word[::-1]의 결과가 참이면 print로 word를 출력해주면 됩니다.
>>> word = 'hello'
>>> word[::-1]
'olleh'
>>> word == word[::-1]
False
>>> word = 'hah'
>>> word[::-1]
'hah'
>>> word == word[::-1]
True
>>>
위 테스트 결과를 살펴보세요.
슬라이스 부분을 복습하면 이해에 도움이 될 겁니다.
처음에는 화문을 판별하기 위해서 반복문을 사용해서 해결할려고 했는데
for i in range(len(word) // 2):
if word[i] == word[-1 - i]:
print(word)
를 실행하면
did
neep
noon
noon
refer
refer
river 이런식으로 출력됩니다.
다행히 시퀀스 뒤집기를 활용하여 문제를 풀 수는 있었지만
반복문으로 해결하려면 어떻게 해야되는지 힌트를 주시면 감사하겠습니다.
심사문제는 정답이 없습니다.
앞에서 배운 이론과 연습문제를 이용하면 풀 수 있습니다. 심사의 목적은 내용 이해와 학습이므로 충분히 풀 수 있게 배려되어 있습니다. 이는 높은 통과율에서 알 수 있습니다. 중간중간 낮은 통과율이 있는 문제는 의도된 것입니다. 지금까지 학습한 내용을 동원해서 잘 풀지 않으면 통과할 수 없는 문제입니다. UNIT 23의 지뢰찾기는 특히 낮은 통과율을 보입니다. 이는 의도된 설계입니다. 학교라면 중간고사라고 생각하면 될 정도의 난이도입니다.
심사 문제는 모두 테스트되었습니다.
<파이썬 코딩 도장>의 심사문제는 베타 기간 1년 6개월, 2400여명이 참여해서 테스트했습니다. 심사 데이터에 문제가 있다면 해당 문제는 통과율 0%가 되고, 이는 관리자가 쉽게 파악할 수 있습니다.
심사 통과자의 통과율은 다음과 같습니다.