본문 바로가기
Problem Solving

[Swift] 프로그래머스 - 모의고사(lv. 1)

by DuncanKim 2023. 2. 4.
728x90

[Swift] 프로그래머스 - 모의고사(lv. 1)

 

1. 문제 

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근

다들 찍는 패턴이 다르기 때문에 하나의 패턴을 상수로 지정해주었다.

그런 다음 answer과 그 상수들을 비교하여 점수를 리턴해주고, 배열을 정렬해서 차례로 뽑아주면 되겠다는 생각을 했다.

 

calculateScore 함수는 answers와 student를 인자로 받는다. answer는 전체 원소를 순회하고, student는 마지막 인덱스에 이르면 다시 처음으로 돌아가서 순회한다. 이를 위해 j를 변수로 하나 더 두어서 만약 j가 student 내에서 마지막 인덱스라면 j를 0으로 만들어주는 로직을 추가하였다.

 

그런다음 array는 2열을 기준으로 정렬하였다. 현재 array는 정렬된 상태이기 때문에 answer에 들어갈 학생이 1명인지 2명인지 3명인지만 알아내면 된다. 만약 셋 다 같은 원소를 1열에 가지고 있다면, 모든 학생을 출력해주면 되고, 한 명이 제일 많이 맞춘 상황이라면 0행 0열에 있는 학생의 번호를 출력해주면 된다.

 

3. 코드

import Foundation

func solution(_ answers:[Int]) -> [Int] {
    let aStudentAnswer = [1, 2, 3, 4, 5]
    let bStudentAnswer = [2, 1, 2, 3, 2, 4, 2, 5]
    let cStudentAnswer = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    let array = [[1, calculateScore(answers, aStudentAnswer)], [2, calculateScore(answers, bStudentAnswer)], [3, calculateScore(answers, cStudentAnswer)]].sorted(by: { $0[1] > $1[1] })
    
    var answer = [Int]()
    if array[0][1] == array[1][1] {
        if array[1][1] == array[2][1] {
           for i in array {
                answer.append(i[0])
            }
            return answer
        } else {
            return [array[0][0], array[1][0]]
        }
        
    } else {
        return [array[0][0]]
    }
}

func calculateScore(_ answer: [Int], _ student: [Int]) -> Int{
    var sum = 0
    var j = 0
    for i in 0 ... answer.count - 1 {
        if answer[i] == student[j] {
            sum += 1
        }
        j += 1
        if j == student.count {
            j = 0
        }
    }
    return sum
}
728x90

댓글