[js] 20230412

Easton Park·2023년 4월 12일

js 공부

목록 보기
6/6

2주차 과제

1) 문제

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.


2) 과정

이왕 코드 짜는거, 단순히 입력만 딱딱 받고 출력 띡 하는 코드보다는, 조금이나마 그럴듯하게 짜고 싶었다.
그래서 사용자 편의성을 위해, index값을 기준으로하지 않고, 일반적인 n번째 글자를 기준으로 오름차순 정렬을 해보기로 했다.

먼저 배열을 입력 받아야지.
친절하게, 요소를 추가할지 말지도 물어보도록 했다.

while (true) {
    strings [i] = prompt(`${i+1}번째 문자열을 입력해주세요 : `)
    i = i+1
    var a = prompt('요소를 추가하시겠습니까? (y/n) : ','')
        if (a==='y'){
            continue;
        } else {
            console.log(`현재까지 입력받은 문자열입니다. : ${strings}`)
            break;
        }
}

이제 입력받은 문자열들의 n번째 글자를 기준으로 오름차순 정렬해야한다.

일반적으로 오름차순 정렬하는데 .sort() 메소드를 썼는데, 문제는 이 친구가 첫글자를 기준으로 한다는 것이다.

그래서 n번째 글자를 따로 변수에 할당하고, 이걸 .concat()으로 합쳐서 첫글자로 만들어버렸다.

const n = prompt(`몇 번째 글자를 기준으로 오름차순 정렬할까요? : `,'')

for (let a = 0; a < strings.length ; a++) {
    var letter = strings[a].substring(n-1,n)
    NewStr[a] = letter.concat(strings[a])
}

NewStr = NewStr.sort()

마지막으로, 엉겨붙은 문자열들을 보여줄 수 없으니, 원래 입력했던 문자열로 정렬 결과를 보여줘야한다.
그냥 편리하게 첫번째 붙은 글자만 지워주기로 했다.

for (let b = 0; b < strings.length ; b++) {
    result[b] = NewStr[b].substring(1)
}

3) 결과

  • 전체 코드
const prompt = require ("prompt-sync")({sigint: true})

var strings = [] // 입력받을 문자열의 배열입니다.
var NewStr = [] // 문자열의 n번째 글자를 앞으로 붙인 배열입니다.
var result = [] // 오름차순으로 정리한 배열입니다.

var i = 0

while (true) {
    strings [i] = prompt(`${i+1}번째 문자열을 입력해주세요 : `)
    i = i+1
    var a = prompt('요소를 추가하시겠습니까? (y/n) : ','')
        if (a==='y'){
            continue;
        } else {
            console.log(`현재까지 입력받은 문자열입니다. : ${strings}`)
            break;
        }
}

// 문제는 n번째 글자라고 했는데, 통상적으로 n번쨰 글자는 index값 + 1 이기 때문에 사용의 편리성을 위해 자의적으로 바꿨습니다.

const n = prompt(`몇 번째 글자를 기준으로 오름차순 정렬할까요? : `,'')


for (let a = 0; a < strings.length ; a++) {
    var letter = strings[a].substring(n-1,n)
    NewStr[a] = letter.concat(strings[a])
}

NewStr = NewStr.sort()

for (let b = 0; b < strings.length ; b++) {
    result[b] = NewStr[b].substring(1)
}

console.log(n +'번쨰 글자를 기준으로 오름차순 정렬한 결과입니다. : '+ result)
  • 출력 예시
1번째 문자열을 입력해주세요 : sun
요소를 추가하시겠습니까? (y/n) : y
2번째 문자열을 입력해주세요 : bed
요소를 추가하시겠습니까? (y/n) : y
3번째 문자열을 입력해주세요 : car
요소를 추가하시겠습니까? (y/n) : n
현재까지 입력받은 문자열입니다. : sun,bed,car
몇 번째 글자를 기준으로 오름차순 정렬할까요? : 2
2번쨰 글자를 기준으로 오름차순 정렬한 결과입니다. : car,bed,sun

4) 고찰

  • 가독성

이왕 만드는거 그럴듯하게 만들겠다고 했지만, 줄간격이 없어서 가독성이 떨어졌다.
중간 중간에 줄바꿈을 추가하는게 더 나을 것 같다.

  • 편의성

문제 조건 중에 문자열 길이에 대한 제한이나 영어 소문자로만 이뤄진 문자열이라던지 등이 있었는데, 조건을 만족하지 않는 문자열을 입력 시, 배열에 넣지 않고 다시 입력 받을 수 있도록 하면 좋을 것 같다.
또한, 요소를 추가하시겠습니까? 라는 물음에 y혹은 n이 아닌 다른 것을 입력한 상황에서도 에러메시지와 함께 다시 묻는 과정도 필요해 보인다. (혹은, 요소를 추가하기 싫은 경우에는 n을 입력하게 하고 나머지는 else 처리해버리는 것도 방법일지도?)

profile
hello world

0개의 댓글