코딩도장 심사문제모음

28.4 심사문제 : 파일에서 회문인 단어 출력하기

codermun 2020. 11. 1. 16:04
728x90
반응형

단어가 줄 단위로 저장된 words.txt 파일이 주어집니다. words.txt 파일에서 회문인 단어를 각 줄에 출력하는 프로그램을 만드세요. 단어를 출력할 때는 등장한 순서대로 출력해야 합니다. 그리고 파일에서 읽은 단어는 \n이 붙어있으므로 \n을 제외한 뒤 회문인지 판단해야 하며 단어를 출력할 때도 \n이 출력되면 안 됩니다(단어 사이에 줄바꿈이 두 번 일어나면 안 됨).

사용한 코드

1. with as 문

2. for 문

3. if 문

4. list

5. reversed

6. strip

첫 접근 방법

메모장에 포함되어 있는 text 들에 \n을 유의하여

회문 비교시와 출력시 \n을 제외해야하는점만 인지하면 해결 할 수 있다.

회문을 판별하는 어떤 방법을 사용하든 정답으로 인정되며

풀이1 에서는 list와 reversed를 이용해서 풀이하였으며

풀이2에서는 코딩도장 해설을 바탕으로 작성해보았다.

풀이.1

1. with as 구문으로 해당 words파일을 읽기모드로 열어준 후 readlines() 메서드를 이용해 파일의 내용을 

한줄씩 리스트로 가져온다.

with open ('words.txt', 'r') as file:
    text = file.readlines() 
    # text = ['apache\n', 'decal\n', 'did\n', 'neep\n', 'noon\n', 'refer\n', 'river']

2.  할당한 text 리스트를 이용해 for 문 을 사용한다

여기서 len(text) 로 # 0 ~ 6까지 반복 횟수를 정해준다

with open ('words.txt', 'r') as file:
    text = file.readlines()
    for i in range(len(text)):
        

3. list의 요소 값으로 비교하기 위해 a b 두 변수를 새로 할당하였다

a 에는 i값에 따라 할당하는데 양옆의 \n는 삭제하면서 text 요소 1개를 이용해 list로 만들어준다.

text[0] == apache // a = list(text[0]) == ['a', 'p', 'a', 'c', 'h', 'e']

b에는 reversed를 이용해 리스트 각 요소를 뒤집어 a와 비교를 해주기 위해 사용하였다

a == ['a', 'p', 'a', 'c', 'h', 'e'] //  b == [e, h, c, a, p, a]

with open ('words.txt', 'r') as file:
    text = file.readlines()
    for i in range(len(text)):# 0 ~ 6
        a = list(text[i].strip('\n')) # ['a', 'p', 'a', 'c', 'h', 'e']
        b = list(reversed(text[i].strip('\n'))) # ['e', 'h', 'c', 'a', 'p', 'a']
        if a == b :
            print(text[i].strip('\n')) # 출력시 \n 다시한번 삭제
            
::
did
noon
refer

## 리스트 각 요소 값이 같은지 비교하는 == 연산자 이용해 뒤집었을때의 값이 같을때만 출력하여 회문을 판별한다.

print시 양옆 \n 삭제하는것을 유의하자

풀이.2

처음 생각하였던 코드에서 strip'\'n 이 너무 많이 등장해 복잡하게 느껴지고 가독성도 좋지 않다.

1. with as 문 동일

2. readlines()로 file안의 내용을 한줄씩 리스트로 words에 할당한다.

3. words 리시트에서 직접 word라는 변수로 가져올 수 있도록 반복문을 구성

여기서 words 에서 가져오는 word에는 \n을 포함하고 있어 삭제를 해주지 않으면 정확한 회문 판별 불가능

아래의 두 코드에서 차이점은 strip 재할당 유무의 strip의 위치에 차이가 있는데

회문 판별시 \n를 제거해주지 않으면 정확한 회문을 판별할 수 없다

a p p l e \n

\n e l p p a

with open ('words.txt', 'r') as file:
    words = file.readlines()
    for word in words:      
        word = word.strip('\n')     # strip 위치
        if word == word[::-1]:
            print(word)
::
did
noon
refer

 

with open ('words.txt', 'r') as file:
    words = file.readlines()
    for word in words:
        if word == word[::-1]:
            print(word.strip('\n'))  # strip 위치

728x90
반응형