Day 18 - Queues and Stacks

오늘도 HTML5와 CSS만 공부하다가 내 뇌 용량 속에서 파이썬이 밀려날까봐 급하게 쉬운 문제 하나 풀어본다.

문제 풀이

문제 해석

palindrome은 역순으로 나열해도 같은 형태를 갖는 글자 또는 숫자이다. (검색해보니 우리말로 회문이라고 한다던데 처음 들어보는 말이다. 어렸을 때 소주만병만주소, 다시합창합시다 등의 문장으로 말장난 했던 기억은 난다.)
이 palindrome을 판별하는 클래스를 만들어보는 문제이다.

Task

  • stackqueue의 역할을 할 두 개의 instance variable을 만들어라.
  • pushCharacter(char ch)라는 메소드로 stack에 글자를 쌓게 하고, enqueueCharacter(char ch)라는 메소드로 문자를 queue에 순서대로 넣게 해라.
  • popCharacter()로 stack 맨 위에 쌓여있는 글자(즉 마지막 글자)를 리턴시키고, dequeueCharacter()라는 메소드로 queue에 있는 첫번째 글자를 리턴시킨다.

Input Format

  • 친절한 HackerRank 말하길 “넌 그냥 클래스나 만드렴, 한 줄의 문자열 s는 내가 코딩해서 넣어줄게”

Output Format

  • 친절한 HackerRank 또 말하길 “넌 그냥 클래스에서 메소드나 만들어, palindrome 판단하는 output 코딩은 내가 책임진다.”

문제 풀이

이미 주어진 코드 해석

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
s=input()	#인풋이 s라는 변수에 할당
obj=Solution() #Solution 클래스를 통해 obj라는 객체 생성
l=len(s) #인풋 단어의 길이가 l라는 변수에 할당

for i in range(l): #내가 만들어야 하는 stack과 queue에 각 글자를 삽입
obj.pushCharacter(s[i])
obj.enqueueCharacter(s[i])

isPalindrome=True #별도 변동이 벗을 경우 isPalindrome은 참

for i in range(l // 2):
if obj.popCharacter()!=obj.dequeueCharacter():
isPalindrome=False
break
#stack에 마지막으로 쌓인 글자와 queue의 첫 글자를 비교하는 반복문을 2로 나눈 몫만큼만 돌린다.

if isPalindrome:
print("The word, "+s+", is a palindrome.")
else:
print("The word, "+s+", is not a palindrome.")

마지막에 palindrome인 경우와 아닌 경우의 출력문까지 세팅이 준비되어 있다.

코드 작성하기

  • stack은 가장 나중에 넣은 글자가 위에 쌓이고(LIFO, Last In First Out), queue는 가장 먼저 넣은 글자 순서대로(FIFO, First In First Out) 튀어나와야 한다.
  • 서로 다른 방법으로 접근해야 하나 싶겠지만, 둘다 빈 list로 instance variable을 만들어두고 리스트 메소드 pop(index)에 index값을 주면 간단히 해결.
    • 생성자로 빈 stack과 queue 리스트를 만든다.
    • append()로 집어넣는 메소드를, pop()으로 튀어나오는 메소드를 만들어준다.
    • pop()을 인자 없이 넣으면 마지막에 넣은 값이 튀어나오는 게 default
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      class Solution:
      def __init__(self):
      self.stack = []
      self.queue = []
      def pushCharacter(self, c):
      self.stack.append(c)
      def enqueueCharacter(self, c):
      self.queue.append(c)
      def popCharacter(self):
      return self.stack.pop(0)
      def dequeueCharacter(self):
      return self.queue.pop()

느낀 점

아주 쉬워서 그닥 푼 느낌이 나지 않지만 그래도 파이썬과 더 멀어지지 않았다는 것에 의의를.