코틀린/코딩테스트

코딩테스트 [암호 해독]

정혜현 2024. 6. 17. 11:35

문제

군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.

암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.

 

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


 

풀이

1.1 관찰

문자열에서 변수의 배수번째 문자만 출력하는 문제

입력 : 문자열, 정수

출력 : 문자열

배수번째 문자를 꺼내야하므로 인덱스 번호를 확인해야겠다.

 

1.2 계획 

반복하기 : cipher 모든 문자 반복하기. 

조건달기 : code의 배수가 맞는지 확인하기. 확인은 인덱스번호로 한다.

answer에 더하기 : 조건에 일치하면 answer에 더해서 담기

 

 

 

2. 시행착오

2.1 시도

class Solution {
    fun solution(cipher: String, code: Int): String {
        var answer: String = ""
        for(i in cipher.indices) {
            if(i != 0 && i % code == 0) answer += cipher[i-1]
        } 
        return answer
    }
}

 

검증결과 : 실패. 에러는 없는데 결괏값과 기댓값이 다르다. 마지막 인덱스번호를 못담는다.

원인분석 : i가 반복 횟수에 비례한 숫자라는 점을 응용하느라 cipher의 인덱스번호로 정의했지만 인덱스는 0번부터 시작해서 0으로는 code를 나눌 수 없다. 그래서 0이 아니어야된다는 조건을 걸었고 인덱스는 0부터 시작하지만 요소는 1번째부터 적용해야돼서 []인덱스번호에  -1을 걸었다. 여기까진 좋았으나 마지막 인덱스를 고려하지 못했다. 인덱스 번호는 언제나 마지막 요소보다 -1 작기 때문에 담을 수는 있게 설정했지만 확인할 수가 없다. 

해결방안 : 인덱스 번호가 아닌 문자열의 길이로 범위를 수정한다.

class Solution {
    fun solution(cipher: String, code: Int): String {
        var answer: String = ""
        for(i in 0 .. cipher.length) {
            if(i != 0 && i % code == 0) answer += cipher[i-1]
        } 
        return answer
    }
}

 

 

굳이 0번부터 범위를 설정하고 0이 아니라는 조건을 걸 필요가 없다. 

class Solution {
    fun solution(cipher: String, code: Int): String {
        var answer: String = ""
        for(i in 1 .. cipher.length) {
            if(i % code == 0) answer += cipher[i-1]
        } 
        return answer
    }
}

 

팀원분의 시선에서 해석하고 문제풀이를 한 뒤 성능을 향상시키는 방법까지 블로그 하단에 잘 정리해주셨다. 감사합니다! https://tsi0511.tistory.com/96

 

2024. 06. 26 와... 강의와 개인프로젝트에 집중하느라 비공개로 해둔 이 코딩테스트를 오늘 정리하게 된건데 이틀 전 String이 참조변수인 것을 알았고 오늘 StringBuilder를 배웠더랬다. https://hhyun-s2.tistory.com/85

이 문제를 풀 당시에는 '나중엔 성능도 고려해야 되는구나' 정도로만 새겨졌는데 지금보니 왜 필요한거고 무슨 설명을 하고 있는지 이해된다!!!! 아는만큼 보인다 정말

 

 

 


 

회고

일주일 전에는 막막했던 문제였고 설명도 이해하기 어려웠는데 혼자 풀어낼 수 있고 설명도 이해할 수 있게 됐다.

 

개인프로젝트를 공유해보니까 나는 코드구현도 겨우 했는데 기능은 물론이고 예쁜 UI까지 갖춘 작품이 많았고, 사람들과 모여 학습내용을 나누다보니까 내 지식의 최정상은 그들의 기저였다. 능력의 차이는 더 배울 수 있다는 지표가, 더 배우고 싶다는 욕심이 되어주므로 타인과 나를 비교하지 않을 수는 없다.

 

다만 나를 성장시킬 감사한 기회와 내가 성장해야 될 목표치로만 설정하고 흔들리지 말 것