항해99/99club1기TIL

[99club/TIL] 1주차 - 토요일 TIL(Today I Learned)

delay100 2024. 3. 30. 17:43
728x90
반응형
SMALL

안녕하세요! delay100입니다. 

토요일에도 역시 문제를 출제해주셔서 문제를 풀어보았습니다.


미들러 문제.

숫자 문자열과 영단어 (https://school.programmers.co.kr/learn/courses/30/lessons/81301)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

먼저 String s 에서 현재 문자가 알파벳인지, 숫자인지를 파악해야합니다.

그런데 첫 글자만 비교하기엔 two, three와 four, five를 봤을 때 중복이 발생합니다.

따라서 두 글자씩 끊으면 tw, th / fo, fi가 되어 중복이 발생하지 않게 됩니다.

중복이 발생하지 않으면 각 값을 key로 이용할 수 있습니다.

 

또한 plusIndex를 만들어준 이유는 key값을 두 글자씩 끊어서 생각하기 때문입니다.

String s를 순환할 때 알파벳인 경우 "해당 알파벳 길이 -1" 만큼 index를 이동해주어야 합니다.

예를들어, String s가 "zero1" 경우 현재 index가 0, zero를 확인하고 다음 1로 이동해야하므로 index를 3만큼 추가해야합니다.

왜 4만큼 가지 않냐면, 문자열을 확인할 때  for문이 실행될 때마다 +1을 하기 때문에 +3을 해야 그 다음 i++에 의해 1에 도달할 수 있게 됩니다.

즉, 아래의 표를 생각해 내는 것이 핵심입니다. 

key | value | plusIndex
ze, 0, 3
on, 1, 1
tw, 2, 1
th, 3, 4
fo, 4, 3
...

풀이방식은 Node 클래스를 만들어 "0~9"와 "각 알파벳 길이-1" 정보를 묶어두었습니다.

그리고 main에서 map을 만들어 key + (value, plusIndex)를 묶어주었습니다.

import java.io.*;
import java.util.*;

class Node {
    int value; // 0~9를 표시
    int plusIndex; // 각 "알파벳 길이 - 1" 값, 알파벳의 첫 자리에 들어왔을 때 추가해줄 크기입니다. 추후 사용할 반복문에서 for문이 실행될 때 i 값이 1씩 증가하므로 -1을 해주어야 index 에러가 나지 않습니다.
    
    Node(int value, int plusIndex) {
        this.value = value;
        this.plusIndex = plusIndex;
    }
    
    int getValue() {
        return this.value;
    }
    
    int getPlusIndex() {
        return this.plusIndex;
    }
}

class Solution {
    public int solution(String s) {
        StringBuilder sb = new StringBuilder();
        
        Map<String, Node> map = new HashMap<>(); // map을 만들어줍니다. key(알파벳 앞 2자리), Node(알파벳 관련 설정)
        
        map.put("ze", new Node(0, 3));
        map.put("on", new Node(1, 2));
        map.put("tw", new Node(2, 2));
        map.put("th", new Node(3, 4));
        map.put("fo", new Node(4, 3));
        map.put("fi", new Node(5, 3));
        map.put("si", new Node(6, 2));
        map.put("se", new Node(7, 4));
        map.put("ei", new Node(8, 4));
        map.put("ni", new Node(9, 3));
        
        for(int i=0; i<s.length(); i++) {
            if(s.charAt(i)>=97 && s.charAt(i)<=122) { // 문자인 경우
                String subS = s.substring(i, i+2); // 첫 번째 자리 문자와 두 번째 자리 문자를 문자열로 꺼내옴
                sb.append(map.get(subS).getValue()); // 출력 값에 추가함
                i += map.get(subS).getPlusIndex(); // 알파벳 길이-1 만큼 현재 index를 조정해줌
            } else { // 숫자인 경우
                sb.append(s.charAt(i)-'0');
            }
        }
        int answer = Integer.parseInt(sb.toString()); // 문자열을 숫자로 변환해 출력 타입을 int로 변경
        return answer;
    }
}

 

+ 비기너 문제

문자열을 정수로 바꾸기 (https://school.programmers.co.kr/learn/courses/30/lessons/12925)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

+ 챌린저 문제

삼각 달팽이 (https://school.programmers.co.kr/learn/courses/30/lessons/68645)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


봐주셔서 감사합니다!

728x90
반응형
LIST