늘은 17일차

 

오늘부터 프로그래머스에서 문제 풀이를 시작했다!

 

...근데 0단계부터

ㅎ...

1단계 5문제는 풀어야 AI가 문제 추천을 해준다는데, 다 까먹고 0단계도 버벅거리는(사실 스위프트 문법을 몰라서) 나에겐 0단계가 딱인 것이다. 

알고리즘은 알지 그걸 스위프트로 어떻게 써야 하는지를 모르지...

 

우리의 챗GPT ? 친구 : 원수 가 많이 도와줬다. 

 

문제 풀면서 노션에 정리해 놨는데 그냥 복붙 해야겠다ㅎㅎ

 

아 근데 왜 노션 자꾸 그램에서 로그아웃되냐... 맥북은 걍 유지 잘되던데

 

 


  1. https://school.programmers.co.kr/learn/courses/30/lessons/181944

홀짝 출력

 

 

내 코드

import Foundation

let a = Int(readLine()!)!

if a % 2 == 0 {
    print("\\(a) is even")
} else if a % 2 == 1 {
    print("\\(a) is odd")
}

 

다른 코드

import Foundation

let a = Int(readLine()!)!
print(a, "is", a % 2 == 0 ? "even" : "odd")

디테일은 다 달라도 삼항연산자 쓰는 게 좀 더 깔끔해 보인다.

 

 

 

2. 

https://school.programmers.co.kr/learn/courses/30/lessons/181950

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열 숫자 입력받아서 숫자 번 만큼 문자열 반복출력

 

 

내 코드

import Foundation

let inp = readLine()!.components(separatedBy: [" "]).map { $0 }
let (s1, a) = (inp[0], Int(inp[1])!)
var resultStr: String = ""

for _ in 0 ..< a {
    resultStr += s1
}

print(resultStr)

 

다른 코드

import Foundation

let inp = readLine()!.components(separatedBy: [" "]).map { $0 }
let (s1, a) = (inp[0], Int(inp[1])!)

print(String(repeating: s1, count: a))

 

- 챗 gpt의 해설

 

이 코드는 사용자로부터 문자열과 숫자를 입력 받아서 입력한 문자열을 입력한 숫자만큼 반복해서 출력하는 기능을 수행합니다.

  1. import Foundation: Foundation 프레임워크를 가져옵니다. 이 프레임워크는 Swift에서 문자열 다루기와 같은 작업을 수행하는 데 도움이 됩니다.
  2. let inp = readLine()!.components(separatedBy: [" "]).map { $0 }: readLine() 함수를 사용하여 사용자로부터 입력을 받습니다. 입력은 공백으로 구분된 문자열과 숫자여야 합니다. components(separatedBy: [" "])를 사용하여 입력된 문자열을 공백을 기준으로 나눕니다. map { $0 }를 사용하여 나눠진 문자열을 배열로 만듭니다.
  3. (s1, a) = (inp[0], Int(inp[1])!): inp 배열의 첫 번째 요소는 문자열이므로 s1에 저장하고, 두 번째 요소는 숫자로 변환하여 a에 저장합니다. 이때 Int() 함수를 사용하여 문자열을 정수로 변환합니다. 사용자가 유효한 숫자를 입력하지 않으면 오류가 발생할 수 있으므로 !를 사용하여 옵셔널 해제를 수행합니다.
  4. String(repeating: s1, count: a): 입력한 문자열 s1을 입력한 숫자 a번 만큼 반복하여 새로운 문자열을 생성합니다.
  5. print(...): 생성된 문자열을 출력합니다.

4번 추가 해설

네, String(repeating: s1, count: a) 부분은 문자열을 반복해서 생성하는 역할을 합니다. 이것은 Swift의 String 클래스의 생성자를 사용하여 수행됩니다.

  • repeating: 반복할 문자열을 지정합니다. 이 경우에는 입력된 문자열 s1이 사용됩니다.
  • count: 반복 횟수를 지정합니다. 이 경우에는 입력된 숫자 a가 사용됩니다.

따라서 String(repeating: s1, count: a)는 입력된 문자열 s1을 입력된 숫자 a번 반복하여 새로운 문자열을 생성합니다. 이후 print 함수를 사용하여 생성된 문자열을 출력합니다.

 

 

 

3. 

https://school.programmers.co.kr/learn/courses/30/lessons/120820

이런 무친 문제

TC에서 시간초과 났다 이게 맞나

그래도 하나... 만 났긴 하다

 

나이 구하기 문제

 

 

실패(1개)한 코드

import Foundation

func solution(_ age:Int) -> Int {
    return 2022 - age + 1
}

 

통과한 코드

import Foundation

func solution(_ age:Int) -> Int {
    return (2022 - age + 1)
}

 

- 왜 위는 되고 아래는 안 됐냐에 대한 챗 gpt의 해설:

두 코드는 사실적으로 동일한 동작을 합니다. 따라서 두 코드 중 하나가 시간 초과되고 다른 하나가 그렇지 않는 것은 기술적으로 설명하기 어렵습니다.

이러한 상황에서 코드의 변경이 시간 초과 문제를 해결했다면, 이는 아마도 다른 요인에 의해 발생한 것이었을 것입니다. 예를 들어, 코드의 컴파일 시간, 테스트 환경의 변경, 또는 다른 부분에서 발생한 영향 등이 그럴 수 있습니다.

이러한 상황에서는 코드의 변경이 실제로 시간 초과 문제를 해결했는지 확인하기 위해 여러 번 실행하여 결과를 확인하는 것이 좋습니다. 그리고 가능하다면 코드의 변경 없이도 문제를 해결할 수 있는지 확인하는 것도 좋은 방법입니다.

  • 챗 gpt의 해결방안

시간 초과 문제를 해결하는 방법은 코드를 최적화하여 실행 시간을 단축하는 것입니다. 이를 위해 다음과 같은 방법을 고려할 수 있습니다.

  1. 효율적인 알고리즘 선택: 시간 복잡도가 낮은 알고리즘을 선택하여 문제를 해결할 수 있습니다. 이를 위해 문제의 특성을 고려하고 효율적인 알고리즘을 구현해야 합니다.
  2. 불필요한 연산 최소화: 코드 내에서 불필요한 연산을 최소화하여 실행 시간을 단축할 수 있습니다. 불필요한 루프나 중복된 연산 등을 피하도록 코드를 작성해야 합니다.
  3. 메모리 사용 최적화: 너무 많은 메모리를 사용하거나 메모리를 불필요하게 할당하는 것도 시간 초과의 원인이 될 수 있습니다. 따라서 메모리 사용을 최적화하여 문제를 해결해야 합니다.
  4. 입출력 최적화: 입력과 출력 작업이 코드 실행 시간에 영향을 줄 수 있습니다. 입력을 한 번에 처리하거나 출력을 최소화하여 실행 시간을 단축할 수 있습니다.
  5. 테스트 및 프로파일링: 코드를 여러 번 실행하고 실행 시간을 측정하여 어떤 부분이 시간을 많이 소비하는지 확인하는 것이 중요합니다. 이를 통해 코드를 개선할 수 있는 지점을 찾을 수 있습니다.

위의 방법들을 고려하여 코드를 최적화하고, 문제를 해결할 수 있을 것입니다. 하지만 가장 효과적인 최적화 방법은 문제의 성격과 코드의 특성을 고려하여 실질적으로 테스트하고 실험하는 것입니다.

 

그냥 운이 없었다고 봐도 될 것 같다. 다만 평균 실행 시간이 간당간당 하다는 거니까 좀 더 효율적인 코드로 바꾸면 좋을 것 같다. 사실 효율적으로 코드를 바꿔달라고 말한 건데 챗gpt가 나한테 짬처리했다. 

 

 

 

4. https://school.programmers.co.kr/learn/courses/30/lessons/120806

‘정수’ 두 개 받고 나눠서 1000 곱하고 정수 부분만 출력

받은 정수를 실수로 만든다는 생각을 못해서 형변환 안 하고 시간낭비 오지게 했다

 

 

내 코드

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    return Int((Double(num1) / Double(num2)) * 1000)
}

 

다른 코드

import Foundation

func solution(_ num1:Int, _ num2:Int) -> Int {
    return num1*1000/num2
}

 

이건 진짜 보고 감탄했다. 

와 이걸 뻥튀기를 먼저 해서 나눠버리네

 

 

 

5. 

https://school.programmers.co.kr/learn/courses/30/lessons/120829

각도기(각도 별 출력)

 

 

틀린 코드

import Foundation

func solution(_ angle:Int) -> Int {
    switch angle {
        case angle > 0 && angle < 90:
        return 1
        case angle == 90:
        return 2
        case angle > 90 && angle < 180:
        return 3
        case angle == 180:
        return 4
    }
}

 

다시 짰던(틀린) 코드

import Foundation

func solution(_ angle:Int) -> Int {
    switch angle {
        case 1 ..< 90:
        return 1
        case 90:
        return 2
        case 91 ..< 180:
        return 3
        case 180:
        return 4
    }
}

default 안 써서 틀림..

 

성공한(마참내!) 코드

import Foundation

func solution(_ angle:Int) -> Int {
    switch angle {
        case 1 ..< 90:
        return 1
        case 90:
        return 2
        case 91 ..< 180:
        return 3
        case 180:
        return 4
        default: // 예외처리
        return -1
    }
}

고맙다 챗지피티야…

처음에 너무 다른 언어 형식으로 스위치를 짰다... 스위프트 문법은 심플한데 사용자가 이 심플함에 익숙하지 않아서 조진 케이스. 

그래도 계속 쓰다 보면 익숙해지겠지~

 

 


심하게 못 푼 문제 거나 내가 한 것보다 더 간단한 코드라 배우고 싶은 문제만 정리했다. 오랜만에 프로그래머스(쉬운 것만) 푸니까 재밌었다... 빨리 단련해서 올해 안에 3단계 까지는 가고 싶다. 

'231205~ > 240325~240913 [iOS]' 카테고리의 다른 글

#26 #014 21일차던가 240423  (0) 2024.04.23
#25 #013 실습_계산기 240418  (0) 2024.04.18
#23 #011 16일차 240416  (0) 2024.04.16
#22 #010 14일차 Timer 실습 240412  (0) 2024.04.12
#21 #009 13일차 240411  (0) 2024.04.11

+ Recent posts