Blog

[Algorithm]20 문제 접근 방식을 정리, 구조 정리, 가공과 변환에 대해 외우지말고 이해하는법 등 생각할점, 배운점

Author
Summary
문제를 보고 목적을 정확하게 구분하자.
Category
Study
Tags
Algorithm
Favorite
Memory Date
2023/08/21
Progress Status
Done
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
5 more properties
문제에서 주어지는 것은 Solution 클래스(기능 구현 부분)에서 받아 오는 매개변수의 타입과 변수명이다. 문제를 잘 해석해야 한다.

문제 설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

제한사항

s는 길이가 1 이상, 100이하인 스트링입니다.
단어 s의 로부터 시작해서 매개변수(main)이 요청하고자 전달하는 인자 값이 무엇인지 알 수 있다. 나는 Solution 클래스에서 매개변수로 정의해야 해당 값을 받아 처리 할 수 있는 메소드를 구성 할 수 있고, 또한 해당 메소드가 main으로 부터 요청에 반환 할 값을 클래스 선언부에서 타입을 지정해야 되고, return을 통해서 반환하는 구성을 해야 한다. 문제에서는 “가운데 글자” 또는 “가운데 두글자”를 반환 하기를 요청하기 때문에 메소드 선언부에서 String 타입을 반환 할 것을 선언해야 하고, return으로 직접적으로 반환에 실을 “무엇”을 명시해야 한다. 글자기 때문에 String타입의 answer라는 변수에 처리된 값을 할당하여 반환할 것이다. 이런 기본적인 메소드와 main에서의 인스턴스 객체를 통한 메서드에 요청 흐름은 스스로 작성 할 수 있어야 해서 ide에서 아무것도 없는 상태에서 모든 것을 적어나갔다. 글로는 어렵지만, 그림으론 생각보다 쉽다. 용어가 어려울 뿐이지 원리를 파악하고 어떤 용어들이 사용되는지만 파악하면 아무것도 없는 메모장에서도 이제 작성할 만큼 ide의 의존도도 낮아졌고 반복하며 외워지고 있는게 느껴졌다.
동일한 클래스에서 main과 기능 구현 클래스를 구성한 상황이다. 코딩테스트 페이지는 저 main부분이 별도의 파일 또는 숨겨져있어서 아랫 부분을 신경 안쓰도록 구성되있고, String s에 할당되는 테스트 케이스들도 숨겨져있거나 별도 창에서 다루도록 정리되어 있다. 하지만 나는 이 부분도 직접 다룰 줄 알아야 한다고 생각했다. 그 연결 관계를 이해해야 하기 때문이다. 객체 지향 프로그래밍으로 넘어가면 메인과 기능을 구현한 클래스, 더 넘어서서 인터페이스, 모델 등 파일들이 분리되기 시작 할 것이다. 지만 동일 프로젝트와 패키지 선상에서 main이 별도로 작성된 파일을 임포트하여 불러오기 때문에 import도 알면서 해야 겠다는 생각이 들었다. 분리 할 줄도, 합칠 줄도 알면 기초적인 구조를 파악하는데 도움이 될 것 같았다.
문제의 접근 방법
문제를 보고 빠르게 내가 사용 할 줄 아는 문법 범위 내에서 어떻게 가공하고 계산을 처리 할 수 있을지 생각해보았다.
//1. String을 char[] 로 만들자. //hello면 char[] = {h,e,l,l,o};가 된다. //2. 길이를 알 수 있다. = 문자열의 길이 최대값을 알아야 한다. strLength //길이가 5다. //3. 가운데 값을 알 수 있다. //가운데값은 길이/2 인데, 2가지 경우로 나눠진다. //방법 1) //가운데 값은 정수가 아니다 == double로 가야 한다. //5글자면 5/2는 2.5이다. 내림처리를 하면, 3으로 index = 2와 같다. //6글자면 6/2는 3이다. 내림처리해도 3이게 되는데, 정수라면 3과 3-1을 뽑아야 한다. //방법 2) //또는 이미 5, 6처럼 길이로부터 정할 수 있다. //5는 홀수이다. 5%2 로 나머지가 1인 경우, //idx가 5/2인 것을 추출하면 int로 나누기 때문에 자동적으로 index 2를 선택 할 수 있다. //6은 짝수이다. 6%2 로 나머지가 0인 경우, //idx가 6/2인 것을 추출하면 실수가 아니기 때문에 일단 index 3을 선택 할 수 있고 그 옆 글자인 index 3 -1을 추가로 선택하면 된다. //나는 선택해야 된다 어떤것이 편할까. //첫번째 방법은 실수와 정수를 왔다갔다한다. 비효율적이다. //두번째 방법은 길이로부터 홀수 짝수를 단순 나머지 연산자%를 통해서 구할 수 있다. 직관적이다. <<<선택 //-------------------------------- //방법 2) 를 선택했다. 코드로 옮겨보자.
Java
복사
방법은 2개였고, 그 중에 형변환을 해야하는 경우와 단순 연산자로도 할 수 있을 것으로 구분되었다. 나는 둘중에 형변환이 들어가면 복잡해지고, 시스템 자체에서도 왠지 느려지지 않을까? 라는 생각에서 단순한 연산자만으로도 구분 할 수있는 방법2를 선택했다.
이제 메소드에서 하나씩 기능을 구현했다.
public String Solution(String s){ //-------------------------------- //방법 2) 를 선택했다. 코드로 옮겨보자. //1. String을 char[] 로 만들자. char[] arr = s.toCharArray(); //방법 2) //또는 이미 5, 6처럼 길이로부터 정할 수 있다. //System.out.println(arr.length); //문자 배열로 변환한 arr에 향상된 for문을 써보자. int strLength = 0; for(int a : arr){ strLength++; } int centerIdx = strLength / 2; int centerIdxLeft = centerIdx - 1; String answer = ""; //5는 홀수이다. 5%2 로 나머지가 1인 경우, if(strLength%2 == 1){ //idx가 5/2인 것을 추출하면 int로 나누기 때문에 자동적으로 index 2를 선택 할 수 있다. answer = String.valueOf(arr[centerIdx]); } //6은 짝수이다. 6%2 로 나머지가 0인 경우, else if(arr.length%2 == 0){ //idx가 6/2인 것을 추출하면 실수가 아니기 때문에 일단 index 3을 선택 할 수 있고 그 옆 글자인 index 3 -1을 추가로 선택하면 된다. answer = String.valueOf(arr[centerIdxLeft])+String.valueOf(arr[centerIdx]); } return answer; }
Java
복사
배운것 1
우선 String은 char의 연속이다. 이론적인 생각은 그렇지만 실제로 그렇게 만들려면 char[]로 실제 변환 가공을 해야 한다. String.toCharArray() 를 통해서 실제 char[]에 문자열을 각 문자로 쪼개어 처리 할 수 있다. 일반적으로 문자라 불리는 문자열들을 가공 해야 할 때 이런 과정이 필요하다.
그냥 영어 그대로 해석하자. 어떤 문자열이 있다. 문자열을.캐릭터어레이로() 처럼 외우지말고 이해하자.
배운것2
이제 조금 더 나아지기 위해서 항상 반복되던 기본형 for loop에서 향상된 for문을 사용해보기 시작했다. 어색하긴 하지만, 계속 다루다 보면 나도 익숙해 질 것이라 생각된다. 하지만 케이스를 잘 생각해야 한다. 기본형은 시작값을 조절하거나 상세한 조건을 설정하거나 증감식을 실제로 조작 할 수 있다. 향상된 for문을 쓴다고 해서 기본형을 절대로 잊으면 안된다. 당연히 모든 배열을 순회 하는 것에는 사용하더라도 특별한 조건이 필요하면 다시 기본 for loop를 꺼내들어야 할 준비를 해야 한다.
배운것3
다시 반환할 값을 생각해야 할 때다. 나는 최초에 String을 char[]로 변환 시킨 점을 잊으면 안된다. 그것을 조작했고, 그것에서 원하는 정보를 추출하는 등 가공을 진행했다. 아직 char[]배열 상태라는 것이다.
하지만 반환해야될 데이터는 다시 String이다. 가공된 char[]의 요소들을 다시 String으로 재 변환 할 필요가 있다. 이럴 때 String.valueOf(arr[n])를 사용해야 한다. 이것은 지금 문자 배열과 문자열에만 속한 문제가 아니다. 다른 문제에서도 내가 가공을 하기위해서 input이라 볼 수 있는 parameter를 변환하는것이 있었으면 또한 반대로 반환에 대해서도 신경 쓰고 원하는 형태로 변환해야 하는 것을 잊지 말자.