티스토리 뷰

 

  문제  

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net


  알고리즘  

부르트 포스 (완전탐색 알고리즘) 설명 바로가기

1. 난쟁이 키를 입력받는다.
2. 9명의 난쟁이들의 키 합을 구한다.
3. 가짜 난쟁이 2명의 키 = 9명의 난쟁이 키 - 100
4. 2중 for문을 이용하여 가짜 난쟁이를 찾으면 된다.
    a. 첫 번째 for문 : 0번째 부터, 8번째까지 (총 9명)의 난쟁이를 탐색
         - 두 번째 for문에서 i+1 을 탐색할텐데, 만약 i = 9이라면, j = 10 -> 배열[10] -> Index error가 발생합니다.
         - 배열은 0번째부터 시작하니까, 난쟁이키배열[10] -> 11번째 난쟁이를 탐색하지 않도록 한 방법입니다.
    b. 두 번째 for문 : i + 1번째 부터, 9번째까지 (10-i명)의 난쟁이를 탐색
         - i번째부터 탐색하는 이유는, 순서 상관없는 조합이기 때문이에요.
         - 난쟁이 (a, b)와 난쟁이 (b, a) 모두 비교할 필요 없이 (a, b)가 끝났다면 (b, a)는 탐색하지 않아도 된다. -> i+1번부터!
    c. 난쟁이키[i] + 난쟁이키[j] = 가짜 난쟁이가 나올 때까지 반복하고, break로 종료합니다.
5. 난쟁이키[i], 난쟁이키[j]를 제거한다.
6. 정렬하여 출력한다.

- 답이 없는 경우가 없고, 답이 여러개라면 아무거나 출력하라는 조건이 문제를 쉽게 만든 느낌이었어요

- 그런데, Swift로 코드를 짜니 어렵게 느껴지더라고요!


  나의 코드  

var info : Array<Int> = [] // 난쟁이 키를 입력받음
var first: Int = 0 // i번째 가짜 난쟁이 정보
var second: Int = 0 // j번째 가짜 난쟁이 정보

// 난쟁이 키 입력받기
for _ in 0...8{
    info.append(Int(readLine()!)!)
}

// 가짜 난쟁이들의 키
let sum: Int = info.reduce(0, +) - 100


for i in 0...7{
    for j in i+1...8{
    
    	// 가짜 난쟁이를 발견하면
        if info[i] + info[j] == sum{
        
        	// 값을 저장한 후 반복문 탈출
            first = info[i]
            second = info[j]
            break
        }
    }
}

// 가짜 난쟁이를 기존 리스트에서 제거 
info.remove(at: info.firstIndex(of: first)!)
info.remove(at: info.firstIndex(of: second)!)

// 오름차순으로 정렬 후 출력
for i in info.sorted(){
    print(i)
}

  Key point!  

📍Swift는 배열의 합을 구하기 위해 리듀스를 사용해야한다. 

📍배열의 remove는 index 기준으로 지워지므로, index를 찾는 추가적인 과정이 필요했다.

📍sorted의 경우, 배열을 반환하기 때문에 for문에서 바로 사용할 수 있었다. (Python과 동일)


  회고  

📍절차형 프로그래밍과 똑같은 방식으로 코딩했더니 에러가 났다. 조금 더 공부해서 원인을 찾아야겠다.

📍알고리즘은 어렵지 않았지만, Swift로 작성하려니 시간이 오래 걸렸다. 기본 문법에 좀 더 능숙해져야겠다.

📍파이팅!!!

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함