[TIL][프로그래머스/Swift] 가위 바위 보

Eden·2024년 11월 23일
3

TIL

목록 보기
51/92
post-thumbnail

문자열을 다른 문자열로 대조하여 변환하는 문제를 여러 가지 방법으로 풀어보았다. Swift에서 문자열 변환 작업을 효율적으로 처리할 수 있는 다양한 접근법을 익히는 좋은 기회였다.

문제 설명

가위는 2, 바위는 0, 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 반환하는 함수를 작성하는 문제입니다.

제한사항

  • 0 < rsp의 길이 ≤ 100
  • rsp와 길이가 같은 문자열을 반환해야 합니다.
  • rsp는 숫자 0, 2, 5로 이루어져 있습니다.

입출력 예

  • 입력: "205"
  • 출력: "052"

1. for문과 조건문 사용

가장 기본적인 접근법으로, for문과 조건문을 이용해 각 문자를 순회하며 치환한다.

최종 코드

import Foundation

func solution(_ rsp: String) -> String {
    var result = ""
    
    for char in rsp {
        if char == "0" {
            result += "5"
        } else if char == "2" {
            result += "0"
        } else if char == "5" {
            result += "2"
        }
    }
    return result
}

풀이 방법

각 문자에 대해 조건문을 사용하여 대응하는 값을 변환한다.

2. map 사용

map을 이용하면 더 간결하게 문자열을 변환할 수 있다.

리팩토링 후 코드

import Foundation

func solution(_ rsp: String) -> String {
    return rsp.map { char in
        switch char {
        case "0": return "5"
        case "2": return "0"
        case "5": return "2"
        default: return ""
        }
    }.joined()
}

풀이 방법

  • map을 사용해 각 문자를 변환하고, joined()를 통해 문자열로 다시 합친다.
  • 코드가 더 간결하고 명확해질 수 있다.

3. Dictionary를 이용한 매핑

딕셔너리를 사용해 매핑 관계를 정의하고, 이를 활용해 변환할 수 있다.

이렇게도 풀 수 있다

import Foundation

func solution(_ rsp: String) -> String {
    let mapping: [Character: Character] = ["0": "5", "2": "0", "5": "2"]
    var result = ""
    
    for char in rsp {
        if let mappedChar = mapping[char] {
            result += String(mappedChar)
        }
    }
    return result
}

풀이 방법

  • 각 문자를 딕셔너리로 매핑하여 변환했다. 딕셔너리를 사용하면 코드가 읽기 쉽고 매핑 관계를 한눈에 파악할 수 있다.

4. zip을 이용한 매핑

zip을 사용해 두 개의 배열을 매핑한 뒤 이를 통해 변환하는 방법도 있다.

이렇게도 풀 수 있다

import Foundation

func solution(_ rsp: String) -> String {
    let keys = Array("025")
    let values = Array("502")
    let mapping = Dictionary(zip(keys, values), uniquingKeysWith: { $1 })
    
    var result = ""
    
    for char in rsp {
        if let mappedChar = mapping[char] {
            result += String(mappedChar)
        }
    }
    return result
}

풀이 방법

  • zip을 사용해 두 배열(keys, values)을 매핑하여 딕셔너리를 생성한 후, 이를 통해 각 문자를 변환했다.
  • 이 방법은 zip을 활용한 흥미로운 응용 예시로, 두 배열의 대응 관계를 쉽게 정의할 수 있었다.

배운 점

  • 문자열을 변환하는 다양한 방법을 통해 각 접근법의 장단점을 파악할 수 있었다!
  • for문과 조건문은 이해하기 쉽지만 코드가 길어질 수 있다.
  • map을 사용하면 더 간결하고 직관적으로 코드를 작성할 수 있다.
  • Dictionary를 이용한 매핑은 매핑 관계가 복잡해질 때 매우 유용하며, 코드의 가독성을 높일 수 있다.
  • zip을 통해 배열 간의 매핑을 정의하는 것도 좋은 접근 방법이지만, 이 문제에서는 조금 과한 느낌이 있다.

이렇게 다양한 접근을 시도하면서 문제를 해결하는 여러 방법을 익혔다. 앞으로 유사한 변환 문제에서 적절한 방법을 선택해 사용할 수 있지 않을까....

profile
Frontend🌐 and iOS

2개의 댓글

comment-user-thumbnail
2024년 11월 24일

zip 이거 아주 매력있어요,, 저두 자주 쓰거든요 아~ 얼른 열심히해서 zip 사야하는데,,

1개의 답글