Profile image with cat

Jaehee

Hi!

Thumbnail of LeetCode - 6. Zigzag Conversion

LeetCode - 6. Zigzag Conversion LeetCode

작성일 : 2021년 11월 07일  / 수정일 : 2024년 06월 05일

LeetCode - 6. Zigzag Conversion

목차

  1. 문제 개요
  2. 풀이
    1. Solution
      1. 제출 결과

문제 개요

난이도 - MEDIUM 사용 언어 - C++

지그재그 변환은 문자열을 지그재그로 변환하는 문제입니다.

예를 들어 문자열 HELLOWORLD가 있다면

H     W
E   W O
L O   R D
L     L

와 같이 변환하여 최종적으로 HWEWOLORDLL로 변환하는게 목표입니다.

문제 - LeetCode 6. Zigzag Conversion

풀이

Solution

제가 풀이한 방법은 지그재그의 규칙을 찾아 수식으로 계산하는 방법을 이용하였습니다.

example equation

문자열을 Row가 3, 4, 5일때 열 인덱스를 초록색으로 표시하였고, 빨간색 숫자로 일반 문자열의 인덱스를 표현하였다.

첫 번째 열과 마지막 열의 문자열의 인덱스는 row + (numOfRow - 1)*2로 표현할 수 있다

그리고 중간 열에는 무조건 중간에 문자가 하나씩 존재한다. 중간에 위치한 문자의 인덱스는 (row + (numOfRow - 1)*2) - ((row-1)*2)로 표현할 수 있다.

제출 결과

Solution 1 result

12ms의 실행 속도가 나왔으며, 다른 C++ 제출자에 비해 약 60%가량 좋은 성능을 보이게 되었다.

코드 전문
#include <string>
 
class Solution 
{
public:
    std::string convert(std::string s, int numRows) 
    {
        if (numRows <= 1) return s;
        
        bool middle = false;
        int curRow = 0;
        int i = 0;
        std::string result = "";
 
        while (result.size() != s.size())
        {
            int index = curRow + (i * ((numRows - 1) * 2));
 
            if (curRow % (numRows - 1) != 0)
            {
                if (middle)
                {
                    index -= (curRow * 2);
                    i--;
                    middle = false;
                }
                else
                {
                    middle = true;
                }
            }
 
            if (index >= s.size())
            {
                curRow++;
                middle = false;
                i = 0;
 
                continue;
            }
 
            result += s[index];
 
            i++;
        }
 
        return result;
    }
};

LeetCode  시리즈의 다른 게시물 보기

Thumbnail of LeetCode - 10. Regular Expression Matching

정규 표현식 "."과 "*"을 구현하여 문자열에서 패턴을 탐색합니다.

2021년 11월 10일

Thumbnail of LeetCode - 9. Palindrome Number

입력된 정수가 회문인지 검사합니다.

2021년 11월 08일

Thumbnail of LeetCode - 8. String to Integer (atoi)

입력된 문자열에서 정수를 Parsing하는 atoi 함수를 구현합니다.

2021년 11월 08일

Thumbnail of LeetCode - 7. Reverse Integer

주어진 정수를 뒤집어(Reverse) 변환합니다.

2021년 11월 08일

Thumbnail of LeetCode - 6. Zigzag Conversion

문자열을 지그재그로 변환합니다.

2021년 11월 07일

Thumbnail of LeetCode - 5. Longest Palindromic Substring

주어진 문자열 중 가장 긴 회문(Palindrome)을 구합니다.

2021년 11월 06일

Thumbnail of LeetCode - 4. Median of Two Sorted Arrays

정수 값이 담긴 두 정렬된 배열의 중앙값을 계산합니다.

2021년 10월 29일

Thumbnail of LeetCode - 3. Longest Substring Without Repeating Characters

문자열에서 똑같은 문자가 반복되지 않는, 가장 긴 부분 문자열을 찾아 반환해야 합니다. Sliding Window 기법과 C++ std::string_view를 이용해 가장 최적의 알고리즘을 작성해봅시다.

2021년 10월 27일