2023. 12. 29(금) Today I Learned

G_NooN·2023년 12월 29일
0

TIL

목록 보기
6/103
post-thumbnail

Programmers #12915 문제 해결


(Lv. 1) 문자열 내 마음대로 정렬하기 (문제 링크)

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때,
각 문자열의 인덱스 n번째 글자를 기준으로 오름차순으로 정렬하는 solution을 완성하라.

예를 들어, strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬한다.

제한 조건

  1. strings는 길이가 1 이상, 50 이하인 배열이다.
  2. strings의 원소는 길이가 1 이상, 100 이하인 문자열이다.
  3. strings의 원소는 소문자 알파벳으로 이루어져 있다.
  4. 모든 strings의 원소의 길이는 n보다 크다.
  5. 인덱스 n의 문자가 같은 문자열이 여러 개인 경우, 사전순으로 앞선 문자열이 앞쪽에 위치한다.

입출력 예시


해결 방법

  1. strings의 각 원소의 n번째 글자를 각 원소의 제일 앞에 추가한다.
  2. Array.sort() 메서드를 사용하여 strings를 사전순으로 정렬한다.
  3. strings의 각 원소의 앞 글자(=1에서 추가한 n번째 글자)를 제거한다.
  4. 최종 배열을 출력한다.

코드

function solution(strings, n) {
  let answer = [];
  
  // strings의 각 원소의 n번째 글자를 각 원소의 제일 앞에 추가
  for (let i=0; i<strings.length; i++) {
    strings[i] = strings[i][n] + strings[i];
  }
  
  // strings를 사전순으로 정렬
  strings.sort();
  
  // strings의 각 원소의 앞 글자를 제거
  for (let j=0; j<strings.length; j++) {
    strings[j] = strings[j].replace(strings[j][0], "");
    // 최종 배열에 입력
    answer.push(strings[j]);
  }
  // 최종 배열 출력
  return answer;
}

시행착오

  1. 내가 생각했던 초기 접근 방법

    strings의 각 원소의 n번째 인덱스의 문자를 뽑아 별도의 배열로 생성하고 해당 배열의 정렬 결과에 따라 strings를 정렬하는 방식

  • 문제점
    1. n번째 인덱스가 모인 배열에서 동일한 문자가 나왔을 때, 처리할 방법을 찾지 못했다.
    2. 인덱스 배열의 결과를 어떻게 strings에 반영할지 방법을 찾지 못했다.
    3. 무엇보다 풀이과정이 매우 복잡해보였다.
  1. forEach문 접근 시도
  • 배열 전체를 순회하는 작업이라서 forEach문을 시도하였다.
	// AS-IS
	for (let i=0; i<strings.length; i++) {
      strings[i] = strings[i][n] + strings[i];
    }
	return strings;

	// TO-BE
	strings.forEach((word) => {
      word = word[n] + word;
    });
	return strings;
  • 문제점

    예상 결과 : ["usun", "ebed", "acar"]
    실제 결과 : ["sun", "bed", "car"]

  • 원인
    - for문 내부의 strings는 solution 함수의 외부에서 선언한 변수이기 때문에, 전체 프로그램에서 사용할 수 있다.
    - 하지만, forEach문 내부의 word는 forEach문의 내부에서 선언한 변수이기 때문에 함수의 결과값은 forEach문의 외부에서 사용할 수 없다.

주요 개념

  1. 변수의 유효 범위(Scope): 전역 변수 / 지역 변수
  2. 배열(Array)의 메서드: .forEach(), .push(), .sort(), .replace()

느낀 점

문제를 푸는 것에 익숙해져야 할 것 같다. 많은 문제를 맞닥뜨려보자.
문제에 대한 접근법, 알고리즘을 캐치하는 능력을 길러보자.

profile
쥐눈(Jin Hoon)

0개의 댓글