프로그래머스 입문문제

[프로그래머스 입문문제] Day 23 배열, 정렬, 문자열

Devleoper_yh 2025. 2. 16. 19:08
반응형

1. 특이한 정렬

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 원소 ≤ 10,000
  • 1 ≤ numlist의 길이 ≤ 100
  • numlist는 중복된 원소를 갖지 않습니다.

입출력 예

numlist n result
[1, 2, 3, 4, 5, 6] 4 [4, 5, 4, 6, 2, 1]
[10000, 20, 36, 47, 40, 6, 10, 7000] 30 [36, 40, 20, 47, 10, 6, 7000, 10000]

입출력 예 설명

입출력 예 #1

  • 4에서 가까운 순으로 [4, 5, 3, 6, 2, 1]을 return합니다.
  • 3과 5는 거리가 같으므로 더 큰 5가 앞에 와야 합니다.
  • 2와 6은 거리가 같으므로 더 큰 6이 앞에 와야 합니다.

입출력 예 #2

  • 30에서 가까운 순으로 [36, 40, 20, 47, 10, 6, 7000, 10000]을 return합니다.
  • 20과 40은 거리가 같으므로 더 큰 40이 앞에 와야 합니다.

제출 답안

import Foundation

func solution(_ numlist: [Int], _ n: Int) -> [Int] {
    // sorted 오름차순 메서드를 사용하여 정렬
    // 절댓값 메서드를 사용하여 
    // abs($0 - n) n과의 거리 기준으로 정렬
    // -$0 : 거리가 같다면 더 큰 숫자가 앞에 오도록 설정
    return numlist.sorted { (abs($0 - n), -$0) < (abs($1 - n), -$1) }
}

 

https://developer.apple.com/documentation/swift/abs(_:)

 

abs(_:) | Apple Developer Documentation

Returns the absolute value of the given number.

developer.apple.com

 


2. 등수 매기기

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 0 ≤ score[0], score[1] ≤ 100
  • 1 ≤ score의 길이 ≤ 10
  • score의 원소 길이는 2입니다.
  • score는 중복된 원소를 갖지 않습니다.

입출력 예

score result
[[80, 70], [90, 50], [40, 70], [50, 80]] [1, 2, 4, 3]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] [4, 4, 6, 2, 2, 1, 7]

입출력 예 설명

입출력 예 #1

  • 평균은 각각 75, 70, 55, 65 이므로 등수를 매겨 [1, 2, 4, 3]을 return합니다.

입출력 예 #2

  • 평균은 각각 75, 75, 40, 95, 95, 100, 20 이므로 [4, 4, 6, 2, 2, 1, 7] 을 return합니다.
  • 공동 2등이 두 명, 공동 4등이 2명 이므로 3등과 5등은 없습니다.

분석

1. 동점 상황이 발생 시 처리 필요

2. 2차원 배열의 평균 점수 계산

3. 딕셔너리를 사용해 동점일 경우 동일 등수 부여

4. 등수 반환

 

제출 답안

import Foundation

func solution(_ score: [[Int]]) -> [Int] {
    // 각 학생의 평균 점수를 계산
    let averages = score.map { Double($0[0] + $0[1]) / 2.0 }
    
    // 평균 점수를 내림차순 정렬하여 순위를 매김
    let sortedScores = averages.sorted(by: >)
    
    // 등수를 저장할 딕셔너리 생성 (동일 점수 처리)
    var rankDict = [Double: Int]()
    for (index, avg) in sortedScores.enumerated() {
        if rankDict[avg] == nil {
            rankDict[avg] = index + 1
        }
    }
    
    // 각 학생의 평균 점수에 해당하는 등수를 반환
    return averages.map { rankDict[$0]! }
}

3. 옹알이(1)

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
    • 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

입출력 예

babbling result
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3

입출력 예 설명

입출력 예 #1

  • ["aya", "yee", "u", "maa", "wyeoo"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

입출력 예 #2

  • ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye", "ye" + "ma" + "woo" = "yemawoo"로 3개입니다. 따라서 3을 return합니다.

유의사항

  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.

제출 답안

import Foundation

func solution(_ babbling: [String]) -> Int {
	// 단어 목록 저장
    let words = ["aya", "ye", "woo", "ma"]
    var count = 0
    
    for word in babbling {
        var temp = word
        
        // 발음할 수 있는 단어를 모두 제거했을 때 아무것도 남지 않는다면 -> 발음가능한 단어
        // 제거 후 문자가 남아있다면 -> 발음 불가 단어
        // 해당 발음을 공백으로 대체 -> 연속된 같은 발음을 방지하기위해 공백으로 처리
        for word in words {
            temp = temp.replacingOccurrences(of: word, with: " ")
        }
        
        // 변환된 단어가 공백으로만 이루어져 있다면 발음 가능한 단어 -> 개수 증가
        if temp.trimmingCharacters(in: .whitespaces).isEmpty {
            count += 1
        }
    }
    
    return count
}

 

https://developer.apple.com/documentation/foundation/nsstring/1412937-replacingoccurrences

 

replacingOccurrences(of:with:) | Apple Developer Documentation

Returns a new string in which all occurrences of a target string in the receiver are replaced by another given string.

developer.apple.com

https://developer.apple.com/documentation/foundation/nsstring/1415462-trimmingcharacters

 

trimmingCharacters(in:) | Apple Developer Documentation

Returns a new string made by removing from both ends of the receiver characters contained in a given character set.

developer.apple.com

trimmingCharacter(in:)
매개변수로 받은 문자를 주어진 문자열의 양 끝에서 제거하여 새로운 문자열을 반환합니다.

4. 로그인 성공?

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

  • 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
  • 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

제한사항

  • 회원들의 아이디는 문자열입니다.
  • 회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.
  • 회원들의 패스워드는 숫자로 구성된 문자열입니다.
  • 회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.
  • id_pw의 길이는 2입니다.
  • id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.
  • 1 ≤ 아이디의 길이 ≤ 15
  • 1 ≤ 비밀번호의 길이 ≤ 6
  • 1 ≤ db의 길이 ≤ 10
  • db의 원소의 길이는 2입니다.

입출력 예

id_pw db result
["meosseugi", "1234"] [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] "login"
["programmer01", "15789"] [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] "wrong pw"
["rabbit04", "98761"] [["jaja11", "98761"], ["krong0313", "29440"], ["rabbit00", "111333"]] "fail"

입출력 예 설명

입출력 예 #1

  • db에 같은 정보의 계정이 있으므로 "login"을 return합니다.

입출력 예 #2

  • db에 아이디는 같지만 패스워드가 다른 계정이 있으므로 "wrong pw"를 return합니다.

입출력 예 #3

  • db에 아이디가 맞는 계정이 없으므로 "fail"을 return합니다.

제출 답안

import Foundation

func solution(_ id_pw: [String], _ db: [[String]]) -> String {
    // id와 pw 저장
    let id = id_pw[0]
    let pw = id_pw[1]
    
    // db를 순회하며 아이디가 찾기
    for user in db {
        // pw가 맞으면 login 아니면 wrong pw 반환
        if user[0] == id {
            return user[1] == pw ? "login" : "wrong pw"
        }
    }
    return "fail"
}

Day 23

반응형