Strings - sWAP cASE

String 변형 메서드를 다루는 만큼 전혀 어렵지는 않지만 이걸 어떻게 가장 간결한 코드로 구현해낼지 고민이 되었던 문제. 아직도 이게 최선인지는 의문이다. 가장 간단한 것이 가장 어려운 것 같다.

문제 풀이

문제 해석

주어지는 문자열의 소문자는 대문자로, 대문자는 소문자로 바꾸어 출력하라.

문제 풀이

Pseudocoding

  • 주어지는 문자열에는 숫자도 있고, 공백도 있으니 일단 알파벳인지 확인하기
  • 문자에 대해서 작업하는 if문 isalpha() 넣기
  • isalpha()가 참인 애들은 islower() 또는 isupper() 중 하나를 써서 삼항조건연산문으로 작업해서 변수에 넣어주기
  • isalpha()가 거짓인, 즉 알파벳이 아닌 애들은 그냥 그대로 변수에 넣어주기
  • 넣은 변수를 빈 list에 담아주는데, string은 인덱스값으로 조회할 수 있으니 for문을 돌리며 작업이 가능할 것.
  • for문으로 하나하나 작업된 문자열이 들어간 list를 join()으로 이어붙여 리턴하기.

이미 주어진 코드 해석

1
2
3
4
5
6
7
def swap_case(s):
return

if __name__ == '__main__':
s = input()
result = swap_case(s)
print(result)
  • 친절한 HackerRank가 인풋을 받아 s에 넣어주고, 내가 만들 함수의 인수로 s를 전달해주었다.
  • 내가 만들 함수 swap_case()가 리턴한 값을 변수 result에 넣어 출력까지 해주었으니 나는 묵묵히 함수만 잘 만들면 된다.

코드 작성하기

1
2
3
4
5
6
7
8
9
def swap_case(s):
res = []
for i in range(len(s)):
if s[i].isalpha():
char = s[i].lower() if s[i].isupper() else s[i].upper()
else:
char = s[i]
res.append(char)
return ''.join(res)
  • string이 immutable이라서 res라는 변수를 만들어 작업했는데 이게 최선이겠지…?
  • char이라는 변수에 s의 각 문자를 담았다가 나중에 append하는 게 좋을지, 아니면 if와 else문에서 바로 append하는게 좋을지 고민하다가 가독성을 위해 char을 한 번 거쳐가기로 했다.
  • res.append(char) 말고 res.insert(i, char)도 동일한 결과를 내지만 인수를 하나라도 덜 쓰는 게 좋을 것 같아서 그냥 append로 고!

느낀 점

  • 쉬운 문제일수록 누구나 풀 수 있기 때문에 어떻게 하면 내가 차별화된 좋은 코드를 짤 수 있을지 고민하게 된다. 이런 걸 보면 차라리 어려운 문제가 나은 것 같기도…?