Algorithm의 중요성 [스코클 TIL_230726]

7과11사이·2023년 7월 26일
0

스파르타코딩클럽

목록 보기
11/90
post-thumbnail

오늘 배운 것

기술면

프로그래머스 기초 문제 두 개 풀이

1. 첫 문제는 몫 구하기

/*
요청 사항 🔥
정수 num1, num2가 매개변수로 주어질 때,
num1을 num2로 나눈 몫을 return 하도록 solution 함수를 완성. 
*/

import Foundation

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

input 값이 아규먼트로 바로 보내진다면, 계산을 바로 하면 될 것 같았다.
별도로 코드를 작성하는 것보다 바로 return을 할 수 있는 방법이 있어 보였다.
num1과 num2가 모두 정수 타입이었기에 활용해서 나누었다.
다행히 해당 몫은 구할 수 있었다!


2. 두 번째는 최빈 값 구하기

/*
요청 사항 🔥
정수 배열 array가 매개변수로 주어질 때,
최빈값을 return할 수 있도록 함수를 완성해보세요.
단, 최빈값이 여러 개면 -1을 리턴해야합니다.
*/

import Foundation

func solution(_ array:[Int]) -> Int {
    var dictionary = [Int: Int]()
    var count = 0
    var result = 0

    for i in array {
        if var value = dictionary[i] {
            value += 1
            dictionary[i] = value
        } else {
            dictionary[i] = 1
        }
    }

    for i in dictionary {
        if i.value == dictionary.values.max()! {
            count += 1
            result = i.key
        }
    }

    return count > 1 ? -1 : result
}

해당 코드는 부분을 나누어 실행했다.
첫번째 코드는 나름 짰는데, 두 번째 방법은 잘 모르겠어서 다른 분의 코드를 조금 봤다... 이실직고!

몰랐는데, '최빈 값'이란 가장 반복적인 수를 의미했다.
❶ 들어온 값이 무엇인지 확인이 필요해보였다
❷ 들어온 값들 중, 가장 반복되는 값을 확인
하는 구성으로 코드를 짰다.

처음에는 배열을 활용해서 값 별로 append를 하는 방법을 떠올렸다. 하지만 그럴 경우, 너무 많은 배열이 생성되고 - 각각 하나씩 확인하여 값을 넣는 방식이 비효율적이게 다가왔다.

비슷한 Collection을 생각해보니 Dictionary가 떠올랐다. Key를 잘 설정하면 Value를 활용해서 특정 Key의 값을 활용할 수 있지 않을까 싶었다.

dictionary에 담아 가장 많이 반복하여 받은 값을 확인하는 구조로 짰다. 왠지 모르겠지만 같은 언어를 사용하지만, 알고리즘과 앱 개발은 정말 다른 세계의 언어인 것 같다. 다른 분의 코드를 참고하기도 해서 온전히 내가 생각해 낸 결과물이라 생각하지 않지만, 일단 파고들기 성공했다!

  • 클래스와 구조체의 가장 큰 차이점을 설명하는 키워드 'Shallow Copy'와 'Deep Copy'에 대해 파악
    그동안 이 키워드는 왜 몰랐을까?

    단순히 구조체와 클래스는 값 타입, 참조 타입이라고 생각을 하고 차이점을 조금은 이해했다고 했지만, 이 상황을 설명하는 키워드가 있을줄 몰랐다.

    결국 보면, 클래스는 참조 타입, 구조체는 값 타입인 것은 맞다.
    구조체에서 생성된 객체와 인스턴스는 '값'만 복사하여 자기 자신에게 담기 때문에 서로 다른 객체로 인식한다.
    반면, 클래스에서 생성된 인스턴스는 '값이 담긴 주소값'을 복사하기에 주소값의 값이 바뀌면 참조하고 있는 모든 값이 바뀐다.

    따라서, 값 자체를 복사하는 구조체는 전부 복사하여 새로 생성되기에 Deep Copy(깊은 복사)라 부르며 값이 아닌 주소값을 복사하는 클래스는 표면적으로만 값을 복사하기에 Shallow Copy(얕은 복사)라 부른다.

  • 참고: https://rok93.tistory.com/entry/얕은복사-VS-깊은복사

회고

  • 그동안 알고리즘이 너무 어려워서, front-end는 알고리즘이 그다지 중요하지 않기에 등 다양한 이유를 대며 외면 했었다. 결국 구현만 잘하도록 노력하면 되잖아?

    하지만 오늘 공부를 하면서 stance가 조금 달라졌다.
    첫번째로 팀원들이 알고리즘에 대해 잘 알고 있고 문제 풀이를 잘하는 동시에 코드 또한 잘 짜는 것이 보였다. 거기서 느꼈던 건, 알고리즘은 코드를 짤 때도 어떤 접근을 해야 할지, 어떤 코드를 작성하는게 조금 더 효율적일지 볼 수 있는 방법이라 생각하게 됐다.

    알고리즘은 단순히 문제 해결을 너머 지금 배우고 있는 언어를 통달하는데 가장 중요한 스텝 중 하나라는 것을 느꼈다!

0개의 댓글