[Leetcode] 806. Number of Lines To Write String

항니·2021년 10월 28일
0

Leetcode Study

목록 보기
2/2

✏️리트코드 스터디 4일차.

오늘은 갑작스런 난이도 상승으로 두 문제를 풀었는데 두시간이 갔다...
어제까진 원래 1시간에 3문제를 풀었었는데,,,
분명 같은 easy여도 체감난이도는 천차만별인갑다.


806. Number of Lines To Write String

문제

해석:
소문자 영어 문자로 이루어진 문자열 s와 각 소문자 영어 문자의 너비(픽셀)를 나타내는 배열 widths가 제공됩니다. 특히 widths[0]는 'a'의 너비이고, widths[1]은 'b'의 너비입니다.

한 줄 당 100픽셀 이하로, 여러 줄에 걸쳐 s를 쓰려고 합니다. 첫 번째 줄에 전체 너비가 100픽셀을 초과하지 않도록 s의 시작 부분부터 글자 수를 적습니다.
그런 다음 두 번째 줄에 s가 멈춘 부분부터 가능한 한 많은 글자를 계속 쓰세요. s를 끝까지 작성할 때까지 이 과정을 반복합니다.


입력:

  • 매개변수 widths: 알파벳 소문자 a~z까지 각각 배당된 픽셀 수가 들어간 리스트. widths.length==26
  • 2 <= width[i] <= 10
  • 매개변수 s: 알파벳 소문자로 이루어진 문자열. 1 <= s.length <= 1000

출력:

  • [ 전체 라인 수, 마지막 라인에 입력된 픽셀 수 ]

이 문제에서 유의할 점
그 문자를 입력할 때 한 라인의 최대 픽셀 수 100을 넘어가게되면,
그 다음줄부터 입력을 시작해야된다는 점이다.

✔️처음 짠 코드

class Solution:
    def numberOfLines(self, widths: List[int], s: str) -> List[int]:
        answer=[]
        sumN=0
        line=0
        for i in range(len(s)):
            sumN+=widths[ord(s[i])-97]
            if sumN>100:
                line+=1
                sumN-=100
        answer.append(line+1)
        answer.append(sumN)
        return answer

이 코드는 첫번째 입력 케이스를 돌리면 100으로 딱 떨어지기 때문에 잘 돌아갔지만,
두번째 입력 케이스 처럼 100에 걸치는 경우에 적용이 안되서 그 부분을 고민하다보니 20분이 끝나버렸다.


✔️집 와서 완성한 코드

class Solution:
    def numberOfLines(self, widths: List[int], s: str) -> List[int]:
        answer=[]
        sumN=0
        line=0
        for i in range(len(s)):
            sumN+=widths[ord(s[i])-97]
            if sumN>100:
                line+=1
                sumN=0
                sumN+=widths[ord(s[i])-97]
        answer.append(line+1)
        answer.append(sumN)
        return answer

sumN이 100을 넘게 될 때에 0으로 초기화 먼저 해주고
다시 해당 문자의 너비를 더해줌으로써 해결 완료!

생각은 유연하게! 코드는 단순하게!
나의 코딩 좌우명을 오늘도 머리에 새긴다.

24ms!

profile
3D 모델 플랫폼에서 데이터 분석을 하고 있습니다

0개의 댓글