본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[C, C++, Java 백준 알고리즘] 11654번 아스키 코드, 10809번 알파벳 찾기 문제 설명 및 풀이!

안녕하세요 오늘도 또 쓰는 알고리즘 파트입니다. 오늘 풀 문제를 보니까 프로그래밍 기초 1학년 수업을 들었던 분이면 한번쯤은 풀어보고 넘어갔을 법한 아스키 코드 출력문제더라고요 ㅎㅎ 아마 코드가 길어지지는 않을 듯 하여, 다음 문제인 10809번 알파벳 찾기 문제와 엮어서 포스팅을 작성해볼까 합니다.


첫번째 문제

정답 비율: 83.2% (역시나 압도적인 정답 비율..ㅎㅎㅎ)

문제 분류: 문자열 사용하기

[11654번] 아스키 코드

문제

알파벳 소문자, 대문자, 숫자 0-9 중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

입출력

입력: 알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.

출력: 입력으로 주어진 글자의 아스키 코드 값을 출력한다.

예제 입력

예제 출력

A

65

C

67

0

48

9

57

a

97

z

122

(풀이는 스크롤 내리면 밑에 있습니다! 같이 풀어보고 정답을 맞춰봐요 ㅎㅎ)

 


두번째 문제

정답 비율: 57%

문제 단계: 문자열 사용하기

[10809번] 알파벳 찾기

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입출력

입력 :

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력 :

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

예제 입력

baekjoon

예제 출력

1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1


아스키코드 ANSWER

아스키코드 관련 문제인데 아스키코드 표 정도는 포스팅에 있어야 예의겠죠?ㅎㅎㅎ

대문자 A가 아스키 코드 값으로 65이고 소문자 a가 이에 32를 더한 97이라는 거 정도는 상식으로 암기해두는 것이 좋습니다. 

[아스키코드 C언어 코드]

#include <stdio.h>
int main()
{
    char c;
    scanf("%c", &c);   printf("%d", c);
}

문자로 입력 받고, 아스키코드가 가진 숫자 값으로 출력하고! 간단해요 ㅎㅎ

[아스키코드 C++언어 코드]

#include <iostream>
int main()
{
    char c;
    std::cin>>c;  std::cout<<(int)c;
}

C++코드는 이렇게 될 수 있겠죠? ㅎㅎ 입출력 함수 한 번씩 써주는게 끝인데 굳이 이름공간을 명시할필요가 있나 싶어서 std namespace std;는 빼고 앞에 std::를 붙여줬어요 ㅎㅎ

[아스키코드 Java언어 코드 - read]

import java.io.IOException;
class Main{
    public static void main(String[] args)throws IOException{
        int c = System.in.read();
        System.out.println(c);
    }
}

콘솔 창에 입력되는 값을 모두 아스키코드 값으로 입력받는 함수입니다. System.out.print과 같은 라인인 System.in.read함수입니다. 다만 C++의 cin과 다르게 아스키코드값으로 입력이 돼요. a를 입력받고 출력하면 a가 나오는게 아니라 97이 출력되는거죠.

[아스키코드 Java언어 코드 - BufferedReader]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int c =  br.read();
        System.out.println(c);
    }
}

결국 똑같은 메서드이기 때문에 버퍼리더로 감싸줘도 정답이겠죠?ㅎㅎ


알파벳 찾기 ANSWER

이 문제를 보자마자 아! 하고 바로 생각나셨다면 정답입니다. 어떤 메서드나 함수를 저격한게 아닐까 싶을정도로 직관적인 문제죠!  

[알파벳 찾기 C++ 코드 string의 find]

#include<iostream>
#include<string>
using namespace std;
int main() {	
	string input;
	getline(cin, input);
	for (char alphabet = 'a'; alphabet <= 'z'; alphabet++) {
		int index = input.find(alphabet);
		cout << index << " ";
	}
	return 0;
}

string의 find를 이용해 구현해봤습니다. 관련 포스팅은 요기 ↓

[C++]string 라이브러리 사용법 1탄, 비교(compare),추가(append),찾기(find),크기(size,length)등 함수(메서드) 예제

 

[C++]string 라이브러리 사용법 1탄, 비교(compare),추가(append),찾기(find),크기(size,length)등 함수(메서드) 예제

[C언어, C++언어, 자바 언어 프로그래밍 강좌 목차] [C++] String Library 알아보기~~!! 1탄입니다. ㅎㅎ String은 문자열을 나타내기 위한 클래스입니다. 문자를 조작하는 일은 정말정말 많이 쓰이죠 ㅎㅎ 한 번..

jhnyang.tistory.com

주의해야할 점은 npos인데요

cout<<input.find(alphabet)<<" ";

이렇게 바로 출력해주면 안된다는겁니다!

해당 문자를 찾지 못할 경우, 우리는 find가 상수 -1로 정의되어있는 npos를 반환할 것이기 때문에 -1이 출력될거라 생각하는데...

find의 반환 값은 size_t로 부호가 없는 타입입니다.

-1은 부호가 있잖아요! 그래서 실제 출력해보면, size_t에서 가질 수 잆는 값 중 가장 큰 값을 자동적으로 매치하기 때문에 -1로 출력되지 않습니다. 원하는 -1의 형태로 출력하고 싶다면 앞에 int로 형변환을 해줘야해요.

#include<iostream>
#include<string>
using namespace std;
int main() {	
	string input;
	getline(cin, input); //입력 a
	cout<<"반환 값:\t"<< input.find('z') << endl;
	cout << "형변환 후:\t" << (int)input.find('z') << endl;
	return 0;
}

결과창

[알파벳 찾기 JAVA 코드 배열]

이번에 자바로 풀어볼껀데요 ㅎㅎ

아무래도 문제의 분류가 문자열이고 앞에 아스키코드 문제도 나왔으니 아스키코드를 활용해서 풀어볼까요??

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
class Main{
	public static void main(String[] args) throws IOException{
		Scanner sc = new Scanner(System.in);
		char[] str = sc.nextLine().toCharArray();
		int[] alphabet = new int[26]; //알파벳은 총 26개!
		Arrays.fill(alphabet, -1);
		
		for(int c = 0; c<str.length; c++) {
			if(alphabet[str[c]-'a']==-1) {
				alphabet[str[c]-'a']=c; 
			}
		}
		
		for(int alpha: alphabet) 
			System.out.print(alpha+" ");
	}
}

메모리: 14260KB

시간: 100ms

코드길이: 499B

첫 번째 for문은 아스키코드 특성 중 b-a는 1, c-a는 2 이렇게 간격만큼 차이가 나는 특성을 활용한 겁니다.

이거 외에 또 종종 보이는 아스키코드 숫자 특성이 있는데요 마찬가지로 숫자에서 가장 기본이 되는 문자 0을 빼주면 실제 정수 값이 나와요! 

무슨 말이냐, '9'-'0'은 integer 9 입니다. 혹시나 해서 정리해보았어요~!!

 

오늘은 여기까지입니다!! 여러분들은 어떤 방식으로 문제를 푸셨나요? ?

도움이 됐다면 지나가기전에 공감 꾸욱~! 잊지말아요 ♡_♡