자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜

[λ°±μ€€] 학생 번호 1235

κΈ°κ°€μ •ν›ˆ 2023. 6. 6. 19:40

1. 문제 링크

 

https://www.acmicpc.net/problem/1235

 

문제

μ΄λ²ˆμ—λŠ” 학생듀을 λ”μš± 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ ν•™μƒλ§ˆλ‹€ κ³ μœ ν•œ 학생 번호λ₯Ό λΆ€μ—¬ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€. 학생 λ²ˆν˜ΈλŠ” 0λΆ€ν„° 9 μ‚¬μ΄μ˜ 숫자둜 이루어진 λ¬Έμžμ—΄λ‘œ, λͺ¨λ“  ν•™μƒλ“€μ˜ 학생 λ²ˆν˜ΈλŠ” μ„œλ‘œ λ‹€λ₯΄μ§€λ§Œ κ·Έ κΈΈμ΄λŠ” λͺ¨λ‘ κ°™λ‹€.

ν•™μƒλ“€μ˜ 번호λ₯Ό λΆ€μ—¬ν•΄ 놓고 λ³΄λ‹ˆ, κΉ€μ§„μ˜ μ‘°κ΅λŠ” μ–΄μ©Œλ©΄ λ²ˆν˜Έκ°€ μ§€λ‚˜μΉ˜κ²Œ κΈ΄ 것은 μ•„λ‹Œκ°€ 싢은 생각이 λ“€μ—ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 7자리의 학생 번호λ₯Ό 보자.

이름 번호
μ˜€λ―Όμ‹ 1212345
κΉ€ν˜•νƒ 1212356
μ΄λ™ν˜Έ 0033445

이처럼 학생 번호λ₯Ό ꡳ이 7자리둜 ν•˜μ§€ μ•Šκ³ , λ’€μ—μ„œ μ„Έ μžλ¦¬λ§Œμ„ μΆ”λ €μ„œ 남겨 놓아도 λͺ¨λ“  ν•™μƒλ“€μ˜ 학생 번호λ₯Ό μ„œλ‘œ λ‹€λ₯΄κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

이름 번호
μ˜€λ―Όμ‹ 345
κΉ€ν˜•νƒ 356
μ΄λ™ν˜Έ 445

ν•˜μ§€λ§Œ μ„Έ μžλ¦¬λ³΄λ‹€ 적게 남겨 λ†“μ•„μ„œλŠ” λͺ¨λ“  ν•™μƒλ“€μ˜ 학생 번호λ₯Ό μ„œλ‘œ λ‹€λ₯΄κ²Œ λ§Œλ“€ 수 μ—†λ‹€.

ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ μ£Όμ–΄ μ‘Œμ„ λ•Œ, λ’€μ—μ„œ kμžλ¦¬λ§Œμ„ μΆ”λ €μ„œ 남겨 λ†“μ•˜μ„ λ•Œ λͺ¨λ“  ν•™μƒλ“€μ˜ 학생 번호λ₯Ό μ„œλ‘œ λ‹€λ₯΄κ²Œ λ§Œλ“€ 수 μžˆλŠ” μ΅œμ†Œμ˜ kλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€

μž…λ ₯

첫째 μ€„μ—λŠ” ν•™μƒμ˜ 수 N(2≤N≤1,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 걸쳐 각 ν•™μƒμ˜ 학생 λ²ˆν˜Έκ°€ μˆœμ„œλŒ€λ‘œ 주어진닀. λͺ¨λ“  ν•™μƒλ“€μ˜ 학생 λ²ˆν˜ΈλŠ” μ„œλ‘œ λ‹€λ₯΄μ§€λ§Œ κ·Έ κΈΈμ΄λŠ” λͺ¨λ‘ κ°™μœΌλ©°, 0λΆ€ν„° 9 μ‚¬μ΄μ˜ 숫자둜 이루어진 λ¬Έμžμ—΄μ΄ 주어진닀. λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” 100보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

좜λ ₯

첫째 쀄에 κ΅¬ν•˜κ³ μž ν•˜λŠ” κ°€μž₯ μž‘μ€ k값을 좜λ ₯ν•œλ‹€.

더보기

예제 μž…λ ₯

3
1212345
1212356
0033445

μ •λ‹΅ : 3

 

2. μ½”λ“œ

let input = Int(readLine()!)!
var studentList : [String] = []
var result : Int = 0

for _ in 0..<input{
    let str = String(readLine()!)
    studentList.append(str)
}

let length = studentList[0].count   // ν•™μƒλ“€μ˜ 학생 λ²ˆν˜ΈλŠ” μ„œλ‘œ λ‹€λ₯΄μ§€λ§Œ κΈΈμ΄λŠ” 항상 κ°™λ‹€

for i in (0..<length).reversed(){   // 0..<7을 λ°˜λŒ€λ‘œ 6λΆ€ν„° 0κΉŒμ§€
    var temp = Set<String>()        // 자λ₯Έ 번호λ₯Ό 쀑볡 처리 μ•ˆλ˜κ²Œλ”
    for j in studentList{

        let startIndex = j.index(j.startIndex, offsetBy: i)     //μ‹œμž‘ 지점을 i둜 ν•œ μ΄μœ λŠ” iλŠ” κ°μ†Œν•˜κΈ° λ•Œλ¬Έμ—
        let endIndex = j.index(j.startIndex, offsetBy: length - 1)  // λλ‚˜λŠ” 지점은 항상 6이기 λ•Œλ¬Έμ—
        let subString = j[startIndex...endIndex]    //λ¬Έμžμ—΄ 자λ₯΄κΈ°
        temp.insert(String(subString))  // temp에 λ„£μ–΄ νŒλ‹¨
    }
    if temp.count == studentList.count{     // μœ„μ—μ„œ μž˜λΌμ„œ 넣은 λ¬Έμžμ—΄μ˜ κ°œμˆ˜κ°€ μž…λ ₯받은 학생 리슀트 κ°œμˆ˜λž‘ κ°™μœΌλ©΄
        result = length - i     // 총 κΈΈμ΄μ—μ„œ ν˜„μž¬ μ§„ν–‰ν•˜κ³  μžˆλŠ” i의 κ°’ λΉΌκΈ°
        break
    }
}

print(result)

 

3. μ½”λ“œ μ„€λͺ…

μž…λ ₯받은 학생 번호λ₯Ό studentList에 μ €μž₯ν•©λ‹ˆλ‹€.
tempλΌλŠ” 빈 Set을 μƒμ„±ν•©λ‹ˆλ‹€. Set은 μˆœμ„œλŒ€λ‘œ 잘린 학생 번호λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μš©λ„μž…λ‹ˆλ‹€.

subString이 λ’€μ—μ„œλΆ€ν„° ν•˜λ‚˜μ”© μ¦κ°€ν•˜λ©΄μ„œ 잘린 λ²ˆν˜Έμž…λ‹ˆλ‹€. 
학생 번호λ₯Ό μˆœμ„œλŒ€λ‘œ λ°˜λ³΅ν•˜λ©΄μ„œ, 각 번호λ₯Ό temp에 μΆ”κ°€ν•©λ‹ˆλ‹€.

for i in (0.. <length). reversed() μ΄μͺ½μ—μ„œ λ°˜λ³΅μ„ λŒλ©΄μ„œ μƒˆλ‘œμš΄ temp을 μƒμ„±ν•©λ‹ˆλ‹€.

 

temp에 μžˆλŠ” 번호의 κ°œμˆ˜κ°€ studentList의 길이와 κ°™μœΌλ©΄, μ„œλ‘œ λ‹€λ₯Έ 번호둜 λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ μ΅œμ†Œμ˜ kλ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.